【问题标题】:How can we make sure that we can just create one instance of a class?我们如何确保我们可以只创建一个类的实例?
【发布时间】:2015-03-09 10:26:17
【问题描述】:

这是一道面试题。面试官向我展示了一个班级人物和另一个班级社区。他想知道我们可以做些什么来确保在 Class Community 中,Class Person 的实例可以被调用一次。

我的方法是将一个布尔标志定义为一个全局变量,如果标志值为 false,则检查类 Person 的构造函数,然后它将创建实例,否则返回错误。这个标志值随着类 Person 的第一个实例的创建而更改为 true。他似乎对答案不太满意。

我了解这可能不是正确的做法。问题是,有没有办法使用类定义或特定类型的类来做到这一点?

【问题讨论】:

  • 他可能希望你通过单例模式的解释来回答。
  • 我认为singleton pattern 如果您正在寻找什么。
  • 非常感谢!我是设计模式的新手。这有帮助。
  • 再问一个问题,我的方法不是解决问题的可行方案吗?
  • @SushimMukulDutta 所以我认为基于Set 的答案是好的答案。

标签: java class design-patterns instance


【解决方案1】:

我对所有 Singleton 命题都不是很满意。

我也会这样回答。但真正的问题似乎是“如何让这个人在社区中独一无二”,这与“如何让我们可以一劳永逸地实例化 Person 类”不同。

在那种情况下,我会做一些完全不同的事情。

我会在 Community 中声明一组 Person 并覆盖 Person 的 equals 方法。

然后,在一个社区中,Person 将是唯一的,但 Person 类仍然可以为其他 Community 实例实例化。

public class Person{
   ...
    public Boolean equals(Object o){
       Person p = (Person) o;
       //you own equals logic
       return isEqual;
    }
    ...
}


public class Community{
    ...
    private Set<Person>;
    ...
}

【讨论】:

  • 我也是这样理解问题面试官的。如果我会使用这种方法,还有Set
  • 是的,我认为标题具有误导性。
【解决方案2】:

你会使用Singleton Pattern

public class Singleton {
    // Private constructor. Prevents instantiation from other classes.
    private Singleton() { }

    private static class SingletonHolder {
            private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
    }
}

或者将您的类创建为 enum 类型,使其成为真正的单例:

public enum Singleton {
    INSTANCE;
    public void execute (String arg) {
        // Perform operation here 
     }
}

【讨论】:

  • 一个只“持有”实例的私有类?为什么你需要一个单独的课程?
  • @Tom 这是许多延迟加载技巧之一。如今,枚举方法是首选方式。
  • @Tom:你也可以在静态块中创建实例。
  • @CamCecil of 在getInstance() 方法中,这对我来说更有意义(imo 它更具可读性)。
  • @Tom 我也不是,除了提到首选方法(而不是使用持有者类或其他延迟加载技巧)是枚举方法。
猜你喜欢
  • 1970-01-01
  • 2012-04-22
  • 2014-06-29
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多