final static w klasie wewnętrznej

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?

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.

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 :)

1

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";
    }
}
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.

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.

1
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 :-)

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