我最近读过关于单例原理的内容,但是如果构造函数是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;
}
}
答案 0 :(得分:3)
您应该创建一个private static Player
变量,并在getPlayer()
方法或静态块中创建对象,如果它为空,则分配给上述变量。
public static Player getPlayer(){
if(player == null){
player = new Player("name", p, i);
}
return player;
}
这样您只创建一个实例。
简单的规则,
private
。private static
变量中。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);