# Finale Attribute und Konstruktor



## Eistoeter (15. Jun 2010)

Hi,

es ist ja aus verschiedenen Gründen gut, wenn man wo möglich Attribute als final deklariert. Aber ich habe dabei immer ein Problem, wo ich doch gerne wissen wollte, ob jemand von euch dafür vielleicht einen Trick kennt?

Und zwar, wenn ich ein Attribut final mache, dann kann ich es nicht außerhalb des Konstruktors setzen. Es kommt ein Compile-Fehler, dass der Konstruktor das Attribut initialisieren muss. Macht Sinn, klar. Aber ich möchte es ja gerne im Konstruktor initialisieren, nur in einer ausgelagerten, privaten Methode. Gibt es da keine Möglichkeit?


----------



## Tomate_Salat (15. Jun 2010)

Mit JNI finale Variablen überschreiben

weiter unten verweist Guest2 zustätzlich noch auf ein Möglichkeit in Java selbst, diese finale variable z u ändern. Aber prinzipiell würde ich mir überlegen, ob es hier wirklich sinn macht, die variable final zu deklarieren.

MFG

Tomate_Salat


----------



## eRaaaa (15. Jun 2010)

Eistoeter hat gesagt.:


> Macht Sinn, klar. Aber ich möchte es ja gerne im Konstruktor initialisieren, nur in einer ausgelagerten, privaten Methode. Gibt es da keine Möglichkeit?



Die Methode könnte den Wert ja einfach zurückgeben, anstelle dass sie ihn selbst setzt ? Und im Konstruktor machste dann halt 

finaleVariable = privateMethode();

???:L


----------



## Wortraum (15. Jun 2010)

Eistoeter hat gesagt.:


> Und zwar, wenn ich ein Attribut final mache, dann kann ich es nicht außerhalb des Konstruktors setzen. Es kommt ein Compile-Fehler, dass der Konstruktor das Attribut initialisieren muss. Macht Sinn, klar.


Halbwegs, ja. Neben dem Konstruktor gibt es auch noch eine andere Möglichkeit:

```
private final int blub;
{ blub = 5; }

private static final int bla;
static {
    bla = 5;
}
```

Ich nutze das sehr gerne, um komplexere Datenstrukturen zu initialisieren, beispielsweise so etwas.

```
/** Die Abbildung zum Kodieren in Base64. */
private static final char[] ENC_MAP = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
    'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
    '7', '8', '9', '+', '/' };

/** Die Abbildung zum Dekodieren aus Base64. */
private static final byte[] DEC_MAP = new byte[128];
static {
    Arrays.fill(DEC_MAP, (byte) -1);
    for (int i = 0; i < 64; ++i) {
        DEC_MAP[ENC_MAP[i]] = (byte) i;
    }
}
```


----------

