Java:不可变的静态变量,可能吗?

时间:2016-04-28 15:33:28

标签: java

我有一个类,它是一个示例代码,而不是真正的代码

private static String className;

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

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

许多课程都使用这个Wish课程,然后每个课程应该&#34;说&#34;使用className方法传递getInstance的愿望。

然后我有类似的东西

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

另一个班级

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

当每个人开始说出他们的愿望时,例如

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!"); 
    }
}

我知道每个对象与Wish类具有相同的副本,并且当每个对象(className)调用Girl, Boy方法时,静态变量Wish.getInstance(Class<?> clazz)会发生变化。< / p>

如何使用静态变量(我希望避免实例化Wish类)并为变量className保留正确的值。

我可以使用静态变量进行此操作吗?或解决方案是实例化(无静态变量)

例如,log4jLogger类,我想用类名做同样的事情。

1 个答案:

答案 0 :(得分:1)

如果您想避免实例化Wish类并使className不是静态的,那么您必须将构造函数设为私有。

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!


    }

}