/ / Inicializujete členské premenné na začiatku definície triedy alebo v konštruktore? - java

Inicializovať členské premenné na začiatku definície triedy alebo v konštruktore? - java

Aký je rozdiel medzi definovanie a inicializácia členských premenných na začiatku definície triedy, a definovanie členských premenných najskôr a inicializácia členských premenných v konštruktore?

Povedzme napríklad:

public class Test {
private int foo = 123;
private boolean flag = false;

public void fooMethod() {...}
}

Proti:

public class Test {
private int foo;
private boolean flag;

public Test() {
foo = 123;
flag = false;
}

public void fooMethod() {...}
}

Vopred ďakujem.

odpovede:

21 pre odpoveď č. 1

Vo vašom príklade je jediný rozdiel, keď súsú inicializované. Podľa JLS sa premenné inštancií inicializujú pred volaním konštruktora. To sa môže stať zaujímavým, ak máte super triedy na vysporiadanie, pretože poradie inicializácie nie je vždy také zrejmé. Nezabudnite preto, že premenné inštancie „super“ budú stále inicializované, aj keď nebude volaný žiadny explicitný superkonštruktor.


7 pre odpoveď č. 2

Rozdiel je v poradí, v akom sú inicializované / nastavené.

Vaše premenné členov triedy budú deklarované / nastavené pred volaním konštruktora. Moja osobná preferencia je nastaviť ich v konštruktore.


2 pre odpoveď č. 3

Inicializácia v triede vám umožňuje vyhnúť sa písaniu triviálneho konštruktora.

Musíte inicializovať členov inštancie, ktorázávisia od parametrov konštruktora vo vnútri konštruktora. Pre čitateľnosť, ak nič iné, by mohlo byť rozumné umiestniť inicializáciu všetkých ostatných členov inštancie do toho istého konštruktora.

Inak to nie je žiadny rozdiel.


0 pre odpoveď č. 4

Konštruktor zvyčajne prijme argumenty a priradí tieto argumenty do polí triedy.

public Test(int foo, boolean flag)
{
this.foo = foo;
this.flag = flag;
}