首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保只初始化一个实例,而不是从另一个类初始化?

如何确保只初始化一个实例,而不是从另一个类初始化?
EN

Stack Overflow用户
提问于 2018-05-22 17:18:55
回答 4查看 1.5K关注 0票数 2

我最近读到了关于单例原则的文章,但是如果构造函数是private的话,我不太清楚如何初始化一个类的单个实例,形成另一个类。如果构造函数应该是private,那么如何从另一个类中设置参数?

代码语言:javascript
复制
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;
    }

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-22 17:21:33

您应该创建一个private static Player变量,并且在getPlayer()方法中或静态块中创建对象,如果对象为null,则将其赋值给上面的变量。

代码语言:javascript
复制
public static Player getPlayer(){
    if(player == null){
        player = new Player("name", p, i);
    }
    return player;
}

这样,您只创建一个实例。

简单的规则,

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

Stack Overflow用户

发布于 2018-05-22 17:21:47

在您调用的另一个类中:Player.getPlayer()

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

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

代码语言:javascript
复制
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;
    }

}
票数 1
EN

Stack Overflow用户

发布于 2018-05-22 17:30:34

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

最后,返回instance

注意到在这里,如果您不止一次调用getPlayer方法,那么实例将被创建(在进一步调用方法getPlayer时将是相同的),在第一次调用静态方法时提供的参数将是相同的。

代码语言:javascript
复制
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;
    }

}

此外,如果您想正确地使用单例模式,那么在创建实例之后,不应该设置属性(没有setters方法)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50473284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档