短
我是否需要做一些其他事情而忽略构造函数?
长:
我想实现无法实例化的类。我在Math类中找到了示例:http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html
所以我会写同样的事情:
public final class MyClass{
public static int doubleMe(int x){
return 2*x;
}
}
构造函数不存在,因此实例化应该是不可能的。
但我不确定让我的班级最终成绩。也许(不一定)我想在将来扩展它(例如,公共类myClassB扩展myClass),这个关键字会阻止它 - 所以它必须在那里吗?。
答案 0 :(得分:3)
我是否需要做一些其他事情而忽略构造函数?
是。如果您自己不编写构造函数,Java将提供一个构造函数。
您需要编写自己的私有构造函数:
public final class MyClass {
// Prevent the compiler from supplying a constructor automatically.
private MyClass() {}
public static int doubleMe(int x){
return 2*x;
}
}
(我已经修改了你的类的名称以遵循普通的Java命名约定。)
如果查看java.lang.Math
的源代码,您会在同一个原因找到私有构造函数。
但我不确定让我的班级最终成绩。也许(不一定)我想在将来扩展它(例如,公共类myClassB扩展myClass),这个关键字会阻止它 - 所以它必须在那里吗?。
您应该只出于多态的原因扩展您的类 - 这与无法实例化的类无关。
答案 1 :(得分:2)
缺少构造函数,因此不可能实例化。
否 - 如果没有声明构造函数,那么Java会自动为该类提供一个隐式默认构造函数,没有正式参数,也没有throws
子句(JLS §8.8.9)。您需要显式声明一个私有构造函数,以使该类无法从外部实例化。现在关于你的第二个问题:扩展一个不可能实例化的类是没有意义的,因此将你的类声明为final
是有意义的 - 尽管这不是使它不可实例化的要求
您可能会发现JLS的以下部分相关:§8.8.10: Preventing Instantiation of a Class。
答案 2 :(得分:1)
除了制作每个方法static
之外,请将该类标记为abstract
。这将阻止它被实例化。
abstract public class MyClass {
...
}
创建私有构造函数会阻止MyClass
之外的类构造它,但不会阻止MyClass
中的某个方法执行它(私有构造函数对类本身是可见的)。
答案 3 :(得分:0)
使用abstract而不是final。
答案 4 :(得分:0)
使用一个(好吧,实际上是你喜欢的多个)构造函数并从中抛出一个未经检查的异常。
没有人能够创建这样一个类的实例。
尽管如此,他们可以使用该类的静态方法/字段。
这种方法听起来像野蛮人,但正式它会起作用。