2015-06-28 7 views
15

Wie würde ich eine Random von java.util.Random in eine supertype constructor anrufen?Mit randoms und super

Zum Beispiel

Random rand = new Random(); 
int randomValue = rand.nextInt(10) + 5; 

public Something() 
{ 
    super(randomValue); 
    //Other Things 
} 

Wenn ich versuche, das der Compiler sagt, dass ich „nicht randomValue vor supertype constructor aufgerufen wurde verweisen kann“.

Antwort

14

Der Aufruf super() muss der erste Aufruf im Konstruktor sein, und alle Ausdrücke, die Instanzvariablen initialisieren, werden erst ausgewertet, nachdem der Superaufruf zurückgegeben wurde. Daher versucht super(randomValue), den Wert einer Variablen, die noch nicht deklariert wurde, an den Konstruktor der Superklasse zu übergeben.

Eine mögliche Lösung rand statisch zu machen (es ist sinnvoll für alle Instanzen Ihrer Klasse einen einzigen Zufallszahlengenerator zu haben) und die Zufallszahl im Konstruktor erzeugen:

static Random rand = new Random(); 

public Something() 
{ 
    super(rand.nextInt(10) + 5); 
    //Over Things 
} 
+4

Die Antwort ist nicht threadsicher. –

+0

@SiyuanRen Entschuldigung für mich fragen, aber was bedeutet Thread Safe Mean? – Dan

+1

@Dan: Es bedeutet, dass die Konstruktion von 'Something' aus verschiedenen Threads gleichzeitig zu kleinen Fehlern führt. Beresfordts Antwort hat dieses Problem nicht. –

7

Eine andere mögliche Lösung ist um einen Konstruktorparameter hinzuzufügen und eine Factory-Methode zu verwenden;

0

Dies ist nicht die eleganteste Lösung, aber eine andere Lösung wäre, 2 Konstruktoren und kein Feld zu haben.

public class Something extends SomethingElse{ 
    public Something(){ 
     this(new Random()); 
    } 

    private Something(Random rand){ 
     super(rand.nextInt(10) + 5); 
     //Other Things 
    } 
}