如何使类不允许创建新对象(new Object())

4

我正在开发一个库,不希望用户使用new关键字直接创建一个类的实例,而是有特殊的方法来创建对象。所以,如果用户使用new关键字实例化一个类,编译器是否可以报错。

public class MyClass {
    private MyClass(int i) {  }

    public MyClass createMyClassInt(int i) {
        return new MyClass(i);
    }

    private MyClass(double d) { }

    public MyClass createMyClassDouble(double d) {
        return new MyClass(d);
    }
}

因此,当用户尝试实例化 MyClass myClass = new MyClass(); 时,编译器将会报错。


你尝试过这段代码吗? - gefei
3
这是它现在所做的。您能否说一下这段代码已经不能实现您想要的功能了吗?(您可以更好地格式化它;) - Peter Lawrey
如果已经有其他(私有)构造函数,则@Rp-:不是必需的。 - Joachim Sauer
@l46kok:谢谢。我之前不知道这个概念。 - twid
2个回答

11

你的代码 几乎 是正确的——你只需要将你的create方法改为静态的,并给它们指定返回类型:

你的代码 几乎 是正确的——你只需要将你的create方法改为静态的,并给它们指定返回类型:

public static MyClass createMyClassInt(int i) {
  return new MyClass(i);
}

public static MyClass createMyClassDouble(double d) {
  return new MyClass(d);
}

这些方法必须是静态的,这样调用者就不需要已经有一个实例的引用才能创建新的实例 :)

编辑:如评论所述,最好将类声明为final


你能告诉我如果使用单例模式会有什么问题吗? - Narendra Pal
@nick:看起来这不是适合单例模式的候选对象,因为调用者可能希望创建具有不同值的多个实例。(就我个人而言,我总体上不喜欢单例模式,但那是另一回事。) - Jon Skeet
@JonSkeet 好的,先生。除了单例模式之外,如果我只想要一个对象,你建议我选择什么? - Narendra Pal
@nick:听起来你的评论与这个问题无关 - 我建议你提出一个单独的问题,并提供更多的上下文。 - Jon Skeet

3

如果您想通过特殊方法创建自己的类,为什么不使用工厂设计模式呢?在您的类中定义一个静态方法,该方法返回类的新实例。

如果您只是不想使用默认构造函数创建新类,并且希望强制用户使用具有参数的构造函数,则只需不实现默认构造函数即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接