2016-04-28 16 views
-1

ich eine Klasse mit diesem haben, es ist ein Beispiel-Code, nicht der eigentliche CodeJava: Intuitive statische Variable, möglich?

private static String className; 

public static Wish getInstance(Class<?> clazz) { 
    if(wish == null) 
     wish = new Wish(); 

    className = clazz.getName(); 
    return wish; 
} 

Viele Klassen verwenden diese Wish Klasse, dann sollte jede Klasse „sagen“ ein Wunsch mit dem className in dem Verfahren getInstance geben.

Dann habe ich so etwas wie dieses

public class Boy { 
    private Wish w = Wish.getInstance(Boy.class); 
    //at this moment the static variable take "com.package.Boy" value 
.... 
} 

Ein weiterer classs

public class Girl { 
    private Wish w = Wish.getInstance(Girl.class); 
    //at this moment the static variable take "com.package.Girl" value 
.... 
} 

Wenn alle beginnen ihre Wünsche zu sagen, Beispiel

public class WishesDay { 
    private Girl g; 
    private Boy b; 

    public void makeYourWish() { 
     g = new Girl(); //get the com.package.Girl value 
     b = new Boy(); //get the com.package.Boy value 

     //sample output "com.package.Boy wants A pink house!" 
     g.iWish("A pink house!"); // the boys don't want this things :(
     b.iWish("A spatial boat!"); 
    } 
} 

Ich weiß, dass jedes Objekt die gleiche haben Kopieren Sie die Wish Klasse und die statische Variable className ändern, wenn jedes Objekt (Girl, Boy) die Methode Wish.getInstance(Class<?> clazz) aufruft.

Wie kann ich eine statische Variable verwenden (ich möchte verhindern, dass die Wish-Klasse instanziiert wird) und den korrekten Wert für die Variable className beibehalten.

Kann ich das mit einer statischen Variable machen? oder die Lösung ist zu instanziieren (keine statische Variable)

Zum Beispiel log4j hat die Logger Klasse, ich möchte das gleiche mit dem Klassennamen machen.

+0

In Java gibt es keine statischen Klassen. Ich bin mir nicht ganz sicher, was Sie tun wollen, aber ich denke, Sie wollen das Singleton-Muster verwenden. https://en.wikipedia.org/wiki/Singleton_pattern –

+0

Wie sieht die iWish-Methode aus? – AdamSkywalker

+0

macht nur eine Ausgabe 'System.out.println (w.className +" will "+ strWish);' –

Antwort

1

Sie müssen Ihren Konstruktor privat machen, wenn Sie die Klasse Wish nicht instanziieren und den className nicht statisch machen wollen.

public class Wish { 

    String className; 


    private Wish(String className){ 
     this.className = className; 
    } 

    public static Wish getInstance(Class<?> clazz) { 
     String className = clazz.getName(); 
     return new Wish(className); 
    }  
    public String getClassName() { 

     return className; 
    } 

} 



package com.test; 
public class WishesDay { 
    private Girl g; 
    private Boy b; 

    public void makeYourWish() { 
     g = new Girl(); //get the com.package.Girl value 
     b = new Boy(); //get the com.package.Boy value 

     //sample output "com.package.Boy wants A pink house!" 
     g.iWish("A pink house!"); // the boys don't want this things :(
     b.iWish("A spatial boat!"); 
    } 
    public static void main(String[] args) { 
     WishesDay wd = new WishesDay(); 


     wd.makeYourWish(); 
     //outputs com.test.Girl wants A pink house! 
     //com.test.Boy wants A spatial boat! 


    } 

} 
+0

Bitte sehen Sie diese https://github.com/ropherpanama/implementations/blob/master/issues/question_1 Ich denke, dass das Beispiel es besser ist, werde ich Ihre Antwort versuchen. Vielen Dank! –

+0

@RosendoRopher Ich sah diesen Link und sie haben das gleiche Problem wie Sie gepostet und ich habe die Implementierung von ein paar Logger org.slf4j zum Beispiel überprüfen, und sie behalten den Klassennamen nicht-statische wie ich – raven

+0

Ja, aber indirekt (durch die getInstance) dies macht eine neue Instanz des Objekts. Es ist der richtige Weg, kann sich das in irgendeiner Weise negativ auswirken? Viele viele Klassen nennen diesen "Schreibprozess".Das Positive ist, dass jetzt der korrekte Wert beibehalten wird. –

Verwandte Themen