Java >> Java tutorial >  >> Tag >> private

Privat finale vs finale privat

Java-sprogspecifikationen, afsnit 8.3.1. Field Modifiers, siger:

FieldModifier:
  (one of)
  Annotation public protected private
  static final transient volatile

Hvis to eller flere (særskilte) feltmodifikatorer vises i en felterklæring, er det sædvanligt , selvom ikke påkrævet , at de vises i den rækkefølge, der er i overensstemmelse med den, der er vist ovenfor i produktionen til FieldModifier.

Hvilket betyder, at private final er den foretrukne stil, men det er nøjagtigt det samme som final private .


Senere bad koden mig om at initialisere variablen i aconstructor, som åbenbart fejler mod en privat endelig variabel, da den er uforanderlig.

Medlemmer markeret som final kan initialiseres i constructor. Du kan enten oprette en prameteriseret konstruktør, som accepterer værdier uden for klassen, eller blot initialisere disse medlemmer direkte med erklæring. Hvis du vælger senere, og datatypen er primitiv, så marker disse medlemmer som static da de vil forblive de samme for alle forekomster af klassen.

DOG fejlede det ikke, da jeg ændrede variablen til en finalprivate... hvilket gjorde mig interesseret

Dette vil ikke være muligt siden private final og final private og er stort set det samme og vil ikke gøre nogen forskel. Men førstnævnte betragtes som god praksis. Du kan følge denne SO for flere detaljer vedrørende bestilling.


Som et eksempel er her et par tilfælde af ting, der er ok og ikke ok med final . Der er ingen forskel mellem private final og final private . For at tilføje til det, @Sagar sagde, kan du initialisere variablerne inline eller i konstruktøren, men ikke begge dele.

public class TestClass {

    private final String i1;
    final private String i2;
    private final String i3 = "test"; // ok
    private final String i4; // not ok, never initialized

    TestClass() {
        i1 = "test1"; // ok
        i2 = "test2"; // ok
        i3 = "test3"; // not ok, overrides already set value
    }

    void mod() {
        i1 = "test0"; // not ok, can't edit final i1
    }
}

Java tag