如何确保仅初始化一个实例但是从另一个类初始化?

时间:2018-05-22 17:18:55

标签: java constructor singleton

我最近读过关于单例原理的内容,但是如果构造函数是private,我就不能完全理解如何从另一个类初始化这个类的单个实例。如果构造函数应该是private

,如何从另一个类设置参数
public class Player {

    String name;
    Position p;
    Inventory i;

    private Player(String name, Position p, Inventory i){

    }

    static {
        instance = 
    }

    public static Player getPlayer(){
        return instance;
    }

}

4 个答案:

答案 0 :(得分:3)

您应该创建一个private static Player变量,并在getPlayer()方法或静态块中创建对象,如果它为空,则分配给上述变量。

public static Player getPlayer(){
    if(player == null){
        player = new Player("name", p, i);
    }
    return player;
}

这样您只创建一个实例。

简单的规则,

  1. 该类的构造函数应为private
  2. 将对象保留在private static变量中。
  3. 为单例对象创建一个getter(没有setter)。
  4. 您还可以将synchronized添加到getter以使其线程安全(可选)。

答案 1 :(得分:1)

在另一个课程中,您致电:Player.getPlayer()

它总是返回类的唯一一个静态实例。构造函数是私有的,因此其他类不能通过构造函数初始化您的类。

获取Player实例的唯一方法是通过静态方法Player.getPlayer(),因此它是单身。

public class Player {

    String name;
    Position p;
    Inventory i;


    private static final Player instance = new Player(.....your argument....);

    private Player(String name, Position p, Inventory i){

    } 

    public static Player getPlayer(){
        return instance;
    }

}

答案 2 :(得分:1)

基本上,通过这种方法,您可以隐藏构造函数(private)并公开一个静态方法来获取instance。在方法中,您检查instance if null是否为instance,如果是,则使用提供的参数对其进行初始化。

最后,您返回getPlayer

注意,如果您多次调用getPlayer方法,将创建实例(并且在方法public class Player { String name; Position p; Inventory i; private static Player instance; private Player(String name, Position p, Inventory i){ // ... } public static Player getPlayer(String name, Position p, Inventory i){ if (instance == null) { instance = new Player(name, p, i); } return instance; } } 的进一步调用中将会相同)第一次调用静态方法时提供了参数。

void computegrade(string name[], int studentno[], float ave[], int top)
{
if (top==0){
    cout<<"Nothing to display\n";
}
 cout<<"Students are: " <<"\n" <<"\n";
 for (int x=top-1; x>=0; x--)
 {
    cout<<"Student Name: " <<name[x] <<endl;
    cout<<"Student No: " <<studentno[x] <<endl;
    cout<<"Average: " <<ave[x];
}
 }

此外,如果要正确使用单例模式,则在创建实例后不应设置属性(无setter方法)。

答案 3 :(得分:0)

只需将私有静态最终INSTANCE字段声明为

即可
private static final INSTANCE = new Person(name, p, i);