Java - obiekty automatyczne.

0

Czy w Javie są obiekty automatyczne? Jeśli tak, to jaki jest ich zakres? Tak jak w C++ zakres bloku?

2

Odpowiednikiem, takim mniej więcej, są klasy anonimowe, które są zazwyczaj wykorzystywane jako implementacje "in-line" interfejsów:

new Thread(new Runnable(){
    public void run(){
      // ...
    }
}).start();

taką konstrukcję (w sensie Runnable) można przypisać do zmiennej albo pola obiektu i wtedy obiekt zostanie "utrwalony", a tak jego życie ogranicza się do bloku w którym jest stworzony (z dokładnością do tego jak sobie z nim GC zatańczy). Nie ma jednak dostępnych rozwiązań w stylu tych > http://4programmers.net/Forum/C_i_C++/200399-dziedziczenie_pytanie_czysto_teoretyczne?p=856889#id856889 .

1

Z tego co mi wiadomo, aytomatyczne obiekty to obiekty ktore maja zasieg bloku i po wyjsciu z niego sa automatycznie usuwane (sciagane ze stosu). W Javie takie wlasciwosci maja tylko prymitywy, chociaz od ktorejs pozniejszej Javy 6 lub 7 JIT moze sobie odkladac krotko zyjace obiekty na stosie - poszukaj, albo spytaj tutaj usera @Wibowit, zdaje mi sie ze on sie na tym zna bo kiedys wpominal.
A Koziolek jak zwykle pierdzieli glupoty, co maja do tego klasy zagniezdzone to nie wiem 8-|. One nie roznia sie kompletnie niczym od zwyklych klas, poza tym ze nie maja nazwy i nie mozna utworzyc ich instancji poza ta jedna ktora sie wlasnie tworzy. Rogaty, prosze cie po raz kolejny, zanim cos napiszesz to przemysl, i nie probuj ubierac niewiedzy i strzelania glupot w smieszne slowka (tanczenie GC, i setki czy tysiace innych uzytych w kazdym twoim poscie).

0

Whatever, man, whatever...

1

Doczytaj komentarz.

2

Nie wiem co to są obiekty automatyczne, ale mam parę uwag.

Co do alokacji na stosie - w miarę świeże wersje HotSpota mają wsparcie dla http://en.wikipedia.org/wiki/Escape_analysis i dzięki temu mogą właśnie alokować na stosie. Co więcej - mogą jednocześnie przeprowadzić optymalizacje takie jak dewirtualizacja, inlining całego kodu klasy i usuwanie martwego kodu, itp itd i może dojść aż do takiego ekstremalnego przypadku jak tutaj: Dlaczego foreach jest gorsze od for (beta)

W Javie nie ma explicite dealokacji, GC usuwa tylko co jakiś czas nieosiągalne obiekty (a to od jakich obiektów zaczyna się sprawdzać osiągalność to już inna bajka, generalnie na pewno referencje leżące na stosie są punktami startowymi). Z tym, że np klasa wewnętrzna posiada implicite wskaźnik do klasy nadrzędnej. Nie jestem pewien w 100% mechanizmu tworzenia klas anonimowych, ale na pewno jeśli będzie się dobierać do pól czy metod z klasy nadrzędnej to wskaźnik implicite na pewno musi być. To może doprowadzić do wycieku pamięci.

Po wyjściu z bloku nie ma gwarancji, że obiekt zostanie natychmiast usunięty, tak samo zresztą jak z nullowaniem referencji. Ja wolę jednak stosować wewnętrzne bloki niż explicite nullować referencje - tworzenie bloków zwiększa czytelność moim zdaniem, bo lepiej widać gdzie dana wartość zmiennej jest używana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1