正确的实现类的方法无法实例化

时间:2013-04-03 19:33:34

标签: java

我是否需要做一些其他事情而忽略构造函数?

长:

我想实现无法实例化的类。我在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),这个关键字会阻止它 - 所以它必须在那里吗?。

5 个答案:

答案 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)

使用一个(好吧,实际上是你喜欢的多个)构造函数并从中抛出一个未经检查的异常。

没有人能够创建这样一个类的实例。

尽管如此,他们可以使用该类的静态方法/字段。

这种方法听起来像野蛮人,但正式它会起作用。

相关问题