final static w klasie wewnętrznej

final static w klasie wewnętrznej
K8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
3

Witam, mógłby ktoś uzasadnić, dlaczego w klasie wewnętrznej niestatycznej może być pole final static, podczas gdy nie można tworzyć w niej pól statycznych?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

A dlaczego ma nie mieć takiej możliwości? Aby zainicjalizować pola statyczne (static final) nie potrzebujesz instancji klasy, więc wydaje się to być jednak logiczne :)

EDIT: to jednak nie takie proste (static final pozwalają, a samo static już nie), bije się w pierś i odpowiadam: nie wiem. Domniemuje, że to rodzi jakieś corner-casy.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
2

Ok chyba znalazłem: https://coderanch.com/t/650397/java/static-final-fields-class

„Dowód nie wprost”: Gdyby dało się ustawiać statici bez final w inner clasie, wówczas jedno pole statyczne mogłoby mieć tyle różnych wartości ile zostało utworzonych klas nadrzędnych. A to przeczy idei statycznego pola, które w danym czasie może mieć jedna wartość (chyba ze zajdzie jakaś czarna magia na poziomie classloaderów i wersji klas, ale na tym się nie znam jeszcze bardziej i to już jakiś hardcore). Może nie do końca precyzyjnie, ale własnymi słowami :)

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
1

Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:

Kopiuj
public class Main {
    class Xxx {
        final static int a = "9".length();
    }
}

Jedyne czego można użyć w ciele takiego final static to literały https://en.wikibooks.org/wiki/Java_Programming/Literals oraz inne final static zawierające literały. Nie można wykonywać na nich metod, dozwolone jest tylko łączenie Stringów i operacje arytmetyczne.

Nie można też rzutować w jakikolwiek sposób, np to się nie skompiluje:

Kopiuj
public class Main {
    class Xxx {
        final static Object a = "0";
    }
}
Korges
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 601
0

Ogólnie z tego co pamiętam developer powinien się dwa razy zastanowić czy na pewno chce stosować słowo kluczowe static z tego względu że pola czy metody oznaczone w ten sposób są przechowywane w oddzielnym sektorze pamięci niż zwykły stack, mało tego, są przetrzymywane przez cały czas działania programu. Można więc rzec że świadomie obcinamy sobie często zupełnie zbędnie cenne miejsce w pamięci. Statyki są nietykalne dla GarbageCollectora.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

W Javie jest Class Unloading w trakcie działania programu, ale w ogóle nie sprawdzałem jeszcze jak duża część statików może być w ten sposób odśmiecona.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
1
Wibowit napisał(a):

Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:

Kopiuj
public class Main {
    class Xxx {
        final static int a = "9".length();
    }
}

Tę poprzeczkę spec wyjaśnia -> "9".length() nie jest const w czasie kompilacji. https://docs.oracle.com/javase/specs/jls/se14/html/jls-8.html#jls-8.1.3
Dlaczego tak design, a nie inny? Nie wiem :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.