final, static i ich modyfikatory dostępu

0

Piszę pewną aplikację używając swinga. W głównej klasie GeneratorFrame chciałbym ustalić domyślny font, background i foreground. Pierwszym moim pomysłem było po prostu:

private static final Font FONT = ...;

Problem pojawił się, gdy jednak zachciałem użyć jakieś specjalnej czcionki, którą musiałbym wczytać z pliku. Przez to automatycznie nie mogę używać stałej statycznej, gdyż FONT mogę dopiero wczytać w konstruktorze. Mam więc coś takiego:

private final Font FONT;
public GeneratorFrame()
{
    FONT = ...;
}

I tu się pojawiają moje pytania. Czy zostawić private i zrobić gettera do stałej FONT, i wszędzie w innych klasach pisać

setFont(generatorFrame.getFONT());

czy może ustawić ją jako publiczną i po prostu odwoływać się do niej generatorFrame.FONT;? - skoro jest finalna, to i tak nie można zmienić jej wartości.
Przy okazji, stałe statyczne zapisujemy W_TEN_SPOSÓB; rozumiem, że po prostu stałe (bez static) też?

Drugie pytanie nieco podobne:
Z pliku wczytuje opis armii. Jest on stały dla danej frakcji i postanowiłem użyć do tego hashmapy (nick, postać):

Map<String, UnitModel> army = HashMap<>();

Czy taka mapa również powinna być zapisana jako finalna i mieć nazwę ARMY? Co to znaczy finalna mapa? Że nie mogę jej ponownie zainicjować, ale elementy mogę dokładać i wyrzucać do woli, tak? Więc jest tak czy inaczej sens robić ją finalną?

Z góry dziękuję za rozwianie moich wątpliwości.

`dodanie znaczników i ``` - @furious programming

0

Nie rozumiem problemu, chcesz mieć możliwość zmieniać zmienną oznaczoną jako final?
Zastanów się po kiego taki final którego można sobie zmienić.

1
  1. Settery/Gettery pozwalają na późniejszą modyfikację kodu, dostęp przez pole już nie.
  2. Tak. Po co robić finalną mapę, skoro można zmieniać jej zawartość? Kwestie optymalizacyjne na przykład. "Adres" tej mapy będzie w ten sposób stały, znany na etapie kompilacji więc można wiele rzeczy uprościć.
0

@_13th_Dragon - Nope. Chodzi mi o to, że chcę mieć zmienną final Font, aby mieć ogólną czcionkę do całego programu (chcę sam dostęp, bez zmian wartości, bez seta) i pytam się, czy lepiej private final Font i odwoływać się getterem do tego (jak się powszechnie robi), czy public final Font i w innych klasach się odwoływać bezpośrednio do tej stałej (nie bojąc się, że przez przypadek zmienimy jej wartość, gdyż jest i tak finalna).

0

Na to jest generalna koncepcja Javy: - jak masz wątpliwości - rób gettery/settery.
Ewentualnie zastanów się nad singletonem.

1

final w Javie odnosi się tylko do wartości referencji, ale już nie do referowanego obiektu. Inaczej mówiąc final w Javie jest płytki. const w C++ może być głęboki, tzn const przy strukturach powoduje, że całe są niemodyfikowalne, wraz z podstrukturami.

Jeśli chcesz mieć niemodyfikowalną mapę to możesz użyć wrappera typu Collections.unmodifiableMap lub buildery do ImmutableMap w Google Guava.

0

Okey, dziękuję za rady.

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