【问题标题】:Correct way to prevent instantiation in Java [closed]防止Java实例化的正确方法[关闭]
【发布时间】:2012-12-20 10:11:09
【问题描述】:

如果我们想防止在 Java 中实例化对象,我们可以使用几种方法,其中最明显的是:

  1. 抽象关键字
  2. 私有/受保护的构造函数

假设类不包含抽象方法,我们使用 abstract 关键字来阻止对象的创建。这种方法不正确(我的意思不是语法正确,而是语义)?还是在这种情况下使用私有构造函数更好?

谢谢

UPD 类将是其他类的基类,尽管它不包含抽象方法。就我而言,它是一些“AbstractTestBase”,其中包含一些通用数据和实用方法,可供某些集成/单元测试组使用。

【问题讨论】:

  • 带有私有构造函数的最终类...
  • 我会说只有当您打算将类子类化时才使用abstract。如果它是不可实例化的实用程序类或类似的:抛出 AssertionError 的私有构造函数
  • @PradeepSimha,我也会这样做 - 并且可能会添加 throws java.lang.UnsupportedOperationException,因此读者的意图立即显而易见。但这是细节。
  • @volodymyr 如果您希望它被子类化,您应该只使用 abstract 关键字:这是预期用途。您不应该使用其他任何东西,因为构造函数 will 仍然作为子对象实例化链的一部分被调用。
  • @volodymyr 拿起一本《Effective Java》来回答这类问题

标签: java oop coding-style semantics


【解决方案1】:

由于您想将该类用作子类,因此“带有私有构造函数的最终类”的建议显然不会起作用,因此您必须采用“抽象”方式。从“抽象类”的定义来看,这是合法的,因为定义准确地说明了你想要什么:

抽象类是一个被声明为抽象的类——它可能会或可能会 不包括抽象方法。抽象类不能被实例化, 但它们可以被子类化。

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多