Inicjowanie zmiennych finalnych poza konstruktorem

2015-02-22 18:52
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?

edytowany 5x, ostatnio: Naitoreivun, 2015-02-22 19:57

Pozostało 580 znaków

2015-02-22 20:48
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2015-02-22 20:49

Pozostało 580 znaków

2015-02-22 20:57
  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/ques[...]ject-after-the-initialization

Pozostało 580 znaków

2015-02-23 00:31
0

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

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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