Warum funktioniert diese kleine Methode nicht?

Herr Kaiser

Bekanntes Mitglied
Hallo Forum,

Ihr blickt sicher durch, warum hier

Java:
Norm.getName(0)

"null" und nicht "Standardwert" zurückgibt, oder? Ich verstehe das nicht:

Java:
public class Norm {

    public static String[] name = new String[6];

    public Norm() {

        name[0] = "Standardwert";
    }

    public static String getName(int index) {
        return name[index];
    }
}

Danke für eure Hilfe!
 
zwei dinge wurden hier vermischt. die variable name ist statisch, die zuweisung an name[0] erfolgt aber dynamisch. aufgerufen wird getName in einem statischen kontext, nämlich über den klassennamen. dann ist immer name[0] noch nicht gesetzt worden.
 
Ist doch logisch

Du machst ja nichmal ein Objekt von der Klasse, somit wird der Konstruktor nciht aufgerufen.

Weißt du was static bedeutet?

Du siehst, ich bin Anfänger. Ich dachte gerade, dass man auf Variablen mit dem Attribut static auchzugreifen kann, wenn kein Obkect gebildet wurde. Da muss ich mich scheinbar doch noch weiter hinein vertiefen. Danke für den Hinweis! 🙂
 
Entweder alles statisch, dann musst du name auch statisch initialisieren

Java:
//entweder so
public static String[] name = new String[]{"bla","laber","sülz"};

//oder so
public static String[] name = new String[6];

static {  //<-- das ist ein statischer Initialisierungsblock
   name[0] = "larifari";
}

Oder du packst alles in ein Objekt:

Java:
public class Norm {
 
    public String[] name = new String[6];
 
    public Norm() {
         name[0] = "Standardwert";
    }
 
    public String getName(int index) {
        return name[index];
    }
}

Der Aufruf geht dann aber nur über eine Objekt-Instanz:
Java:
//z.B. in main
Norm n = new Norm();
System.out.println(n.getName());

//Norm.getName(); <-- geht nicht mehr
 
Zuletzt bearbeitet:
Dank der Hinweise klappt der Zugriff nun einwandfrei. Hab nur noch eine kleine Zusatzfrage:
Da ich auf die Datenstruktur nur 1x zugreifen muss, brauche ich keine unterschiedlichen Objekte der Klasse, so dass die static-Variante ausreicht, um den Code zum Laufen zu bringen. Hätte die Objekt-Variante trotzdem irgendwelche Vorteile? Und gibt es Unterschiede bezüglich Perfomance oder benötigter Ressourcen bei den beiden Varianten? ...
 
Es gibt allgemeine Übereinstimmung darüber, dass static wenig mit "objektorientiert" zu tun hat. Während sogenannte Utility-Klassen, die nur statische Methoden enthalten (wie java.lang.Math, java.util.Arrays oder java.util.Collections), in Ordnung sind, versucht man Klassen mit statischen Werten meist zu vermeiden. Oft verwendet man stattdessen das Singleton-Pattern:

Java:
class Foo {
   private static final Foo FOO = new Foo();

   //privater Konstruktor, deshalb kann es keine Instanzen außer FOO geben
   private Foo(){} 

   //eine nützliche Methode
   public String bar(int i){ return "" + i; }

   public static Foo getInstance() { return FOO; }
}

//Verwendung
String s = Foo.getInstance().bar(42);

Sollte man später einmal z.B. mehrere Instanzen oder Unterklassen benötigen, lässt sich das wesentlich leichter refaktorieren, als eine statische Klasse mit Werten.

Dieses Singleton-Pattern könnte man als eine spezielle Art des Factory-Patterns ansehen. Allerdings ist auch das Singleton-Pattern etwas in Verruf gekommen - nicht unbedingt, weil es immer schlecht ist, sondern weil es zu oft und in unpassenden Szenarien verwendet wurde. Alternativen sind abstrakte Factories oder (wohl die beste Lösung) Dependecy Injection mit Frameworks wie Guice oder Spring. Bei DI "wissen" die Klassen nicht, wo eine Service-Klasse herkommt, das DI-Framework injiziert diese "automatisch" aufgrund einer gegebenen Konfiguration (wo dann auch die Singleton-Eigenschaft der zu injizierenden Klasse spezifiziert werden kann).
 
Zuletzt bearbeitet:
Das ist eine klare Antwort. Vielen Dank! Dachte auch, dass die statische Variante irgendwie sehr prozedural wirkt und das schon aus stilistischen Gründen nicht so elegant ist. Bei den weiteren Hinweisen verstehe ich zwar sehr oft Bahnhof, ich habe aber vor, das zu verändern, und werde die genannten Stichwörter mal wikipedieren. Also danke für den Input! 🙂
 

Zurück
Oben