Inicjowanie zmiennych finalnych poza konstruktorem

0

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?

1

więc dziwie się, że nie dopuszcza takiej możliwości, kiedy dana funkcja na 100% zostanie wywołana
A co to ma do rzeczy? Przecież metoda initmoże być wywołana wielokrotnie.
final oznacza, że pole może być zainicjowane w miejscu deklaracji albo w konstruktorze.

1
  1. Może warto wczytać plik przed utworzeniem obiektu?
  2. Może ta zmienna jest przechowywana w złym miejscu?
  3. Może warto tworzyć obiekt poprzez buildera?
    http://stackoverflow.com/questions/18390362/how-to-set-as-final-a-java-object-after-the-initialization
0

Okey. Dziękuję za rady. Postaram się je wykorzystać.

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