3

短的:

除了省略构造函数之外,我还需要做其他事情吗?

长:

我想实现无法实例化的类。我在这里找到了数学类的例子: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;
    }
}

没有构造函数,所以实例化应该是不可能的。

但我不确定我的课程是否会进入决赛。也许(不一定)我想在将来扩展它(例如 public class myClassB extends myClass)并且这个关键字会阻止它 - 所以它必须在那里吗?

4

5 回答 5

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您会出于同样的原因在那里找到一个私有构造函数。

但我不确定我的课程是否会进入决赛。也许(不一定)我想在将来扩展它(例如 public class myClassB extends myClass)并且这个关键字会阻止它 - 所以它必须在那里吗?

您应该仅出于多态性的原因扩展您的类 - 这与无法实例化的类无关。

于 2013-04-03T19:35:08.840 回答
2

没有构造函数,所以实例化应该是不可能的。

否 - 如果没有声明构造函数,那么 Java 会自动为类提供一个隐式默认构造函数,没有形式参数和throws子句(JLS §8.8.9)。您需要显式声明一个私有构造函数,以使该类无法从外部实例化。现在至于您的第二个问题:扩展一个无法实例化的类是没有意义的,因此将您的类声明为final- 尽管这不是使其不可实例化的要求。

您可能会发现 JLS 的以下部分相关:第 8.8.10 节:防止类的实例化

于 2013-04-03T19:35:19.617 回答
1

除了制作每个方法之外static,将类标记为abstract. 这将防止它被实例化。

abstract public class MyClass {
  ...
}

创建私有构造函数将阻止外部类MyClass构建它,但不会阻止内部方法之一MyClass执行它(私有构造函数对类本身可见)。

于 2013-04-03T19:35:17.253 回答
0

使用抽象而不是最终。

于 2013-04-03T19:35:19.480 回答
0

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

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

不过,他们可以使用类的静态方法/字段。

这种方法听起来很野蛮,但在形式上它会奏效。

于 2013-04-03T19:47:13.843 回答