Od pewnego czasu piszę program i doszedłem do wniosku (między innymi po kilku pierwszych stronach "Czystego kodu"), że kod jest brzydki, nieczytelny, fuj. Nie jest to bardzo mały projekt, więc wolałbym mieć w nim porządek, aby się przed końcem całkowicie nie zgubić. O ile nadawałem sensowne nazwy zmiennym, to nie skupiłem się na podzieleniu programu na mniejsze funkcje. Przykładowo główna klasa programu rozszerzająca JFrame powinna być podzielona na przykładowe funkcje: init(); loadFractions(); makeMenu();
itd. Chcąc to uporządkować natknąłem się na pewien problem. Otóż mam zmienne finalne i nie mogę skompilować programu inicjując je w funkcji wywołanej przez konstruktor.
Przykładowo tak jest ok, ale brzydko:
public class UnitModel
{
private final String name;
...
public UnitModel()
{
name = ...;
...
}
}
a tak wywala błąd, ale wg założeń ładnego pisania tak powinno być (chyba, że się mylę, jeśli tak, to proszę mnie poprawić)
public class UnitModel
{
private final String name;
...
public UnitModel()
{
init();
...
}
private void init()
{
name = ...;
...
}
}
Czy jest jakiś sposób żeby to obejść? Czy po prostu zmienne finalne muszą być inicjowane w konstruktorze? Rozumiem, że są finalne i kompilator musi mieć pewność, że zostaną zainicjowane, więc dziwie się, że nie dopuszcza takiej możliwości, kiedy dana funkcja na 100% zostanie wywołana, a dana zmienna w niej zainicjowana. Z góry dziękuję za pomoc.
EDIT:
Jeszcze może napiszę dlaczego taka sytuacja występuje. Otóż dane o jakiejś postaci wczytuję z pliku, więc nie mogę od razu napisać private final String name = "Bob";
.
Czy rozwiązaniem byłoby po prostu stworzenie zmiennej bez final
oraz bez tworzenia settera, co teoretycznie dałoby podobny efekt, jeśli bym nigdzie i tak nie zmieniał w kodzie wartości name
?