Hallo Forumsgemeinschaft,
ist es möglich das ein Constructor bzw new-Operator eine vorhandene Referenz zurückgibt anstatt eine neue?
Da ich nicht weis ob meine Frage verständlich formuliert ist folgt ein Beispiel:
public final class MyNumber{
public final static MyNumber ZERO=new MyNumber(0.0);
double mynum;
public MyNumber(double d){
if(d==0.0)return ZERO; //<-Sowas in der Richtung
mynum=d;
}
public static void main(String[] args) {
System.out.println(new MyNumber(0.0)==ZERO); //true
}
}
Ist sowas Möglich?
(mir ist bewusst das man solch ein Effekt durch Factorys nachbilden kann)
Worum geht es denn genau?
Falls es ums testen geht, gibt es diverse Mocking Frameworks die den new Operator umbiegen koennen.
Fuer Prodcode nimmt man da eine Factory bzw. ein DI Framework.
Nein, es wird immer ein neues Objekt im Speicher angelegt. Die übliche Vorgehensweise in solchen Fällen ist, eine Factory-Methode zu verwenden:
public final class MyNumber{
public final static MyNumber ZERO=new MyNumber(0.0);
private double mynum;
//Konstruktor nicht öffentlich
private MyNumber(double d){
mynum=d;
}
//Factory-Methode übernimmt die Rolle des Konstruktors
public static MyNumber createMyNumber(double d) {
return d == 0.0 ? ZERO : new MyNumber(d);
}
public static void main(String[] args) {
System.out.println(createMyNumber(0.0)==ZERO); //true
}
}
@maki : Es war mehr ein Gedankenspiel als ein konkreter Fall. Ich habe Immutable-Objects die ich vergleichen will. equals müsste bei einer genauen Prüfung ca. 20 Werte vergleichen. Der Objecttype kommt relativ häufig vor und muss oft auf “Zero” geprüft werden, deswegen dachte ich ein Referenzvergleich wäre schneller.
So hab ich mir überlegt wie ich das realisieren kann, in diesem Zuge kamm die oben beschriebene Frage auf.
@Landei : So hab ich es auch momentan implementiert. Ich wollte eigentlich nur wissen ob das Referenz-Constructor-Ding möglich ist, trozdem Danke. Wird anderen Lesern des Threads sicher Helfen.
@deetee : Wie bei dir nicht? Muss an der SDK liegen, benutzte Java 8 102b :o)
Nochmal Danke an alle.
So neben bei, wo kann ich ein Thema als erledigt markieren? (im F.A.Q. steht nix dazu)