2012-02-01 12 views
7

Jestem studentem w klasie Java i nauczyłem się czegoś o Javie dzisiaj, dzięki czemu moje narzędzia się zmieniają. Kiedy zapytałem nauczyciela, jak i dlaczego, nie był pewien co do tego zachowania. Czy ktoś może wyjaśnić, dlaczego poniższy przykład działa?Zakres Java: Zwrócenie obiektu utworzonego wewnątrz metody - Czy jest niebezpieczny?

class Example { 
    public int ex_val; 

    public Example (int a) { 
     this.ex_val = a; 
    } 

    public int getExVal() { 
     return this.ex_val; 
    } 
} 

Jeśli było stworzenie wystąpienie „Przykład” wewnątrz metody drugiej klasy i „powrót” obiekt może skutecznie dokonać skoku na swojej oryginalnej zakres i mogą być następnie wykorzystane.

class ParentObject { 
    // Instance Variables  
    public Example a; 

    public ParentObject (int number) { 
     // Initialize instance variable object from out-of-scope instantiation 
     this.a = genExample(number); 

     // Verify scope creep 
     System.out.println(this.a.getExVal()); 
    } 

    public Example genExample (int a) { 
     return new Example(a); 
    } 
} 

To działa, ale czy to zachowanie jest stabilne? Czy mogę na to liczyć? Czy menadżer śmieci może przeskakiwać pomiędzy instrukcją return jednej metody a instrukcją przypisania funkcji wywołującej? Czy mam ryzyko niepowodzenia na podstawie wersji JVM mojego systemu operacyjnego? Wydaje się to przydatną funkcjonalnością, jeśli można na niej polegać.

+0

Nie mogę powiedzieć, że rozumiem o co prosisz. Co masz na myśli mówiąc "wyskocz z oryginalnego zakresu"? Czy jesteś programistą C++? –

+2

Mylisz zakres z życiem. Pomyśl o zakresie dotyczącym zmiennych, czasu życia obiektów. –

Odpowiedz

9

Jest to całkowicie normalne, powszechne i niezawodne działanie w Javie, a rzeczą do zrobienia jest przekonanie, że odśmiecacz śmieci oczyści obiekt, gdy tylko nie będzie żadnych żywych odniesień do niego. Nie zależy to od systemu operacyjnego ani od JVM: każda JVM będzie z tym w porządku.

3

To zupełnie normalne.

Śmieciarz nie może go odebrać, ponieważ nadal jest oznaczony przez twoje pole a.

W przeciwieństwie do C++ obiekty Java nigdy nie są łączone z zakresem, który je utworzył.

+0

, "W przeciwieństwie do C++ obiekty Java nigdy nie są połączone z zasięgiem, który je utworzył." -> To jest nieprawidłowe. Jeśli obiekt jest tworzony w treści funkcji, a odniesienie do niego nie jest "wyciekane" w postaci argumentu return lub w inny sposób, to jego czas życia jest powiązany z zakresem, w którym został utworzony, tj. Po tym obiekcie jest poza zakresem, kwalifikuje się do zbierania śmieci. Może być konieczne ponowne sformułowanie ostatniej linii. – eternaln00b

+0

@SiddharthaShankar: Chociaż jest to prawda, obiekt nie jest jawnie _linked_ do zakresu. Raczej po prostu ma to samo życie. – SLaks

Powiązane problemy