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?
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.
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 :)
Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:
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:
public class Main {
class Xxx {
final static Object a = "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.
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.
Wibowit napisał(a):
Podnoszę poprzeczkę :) To poniżej też się nie kompiluje:
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 :-)