2013-04-03 94 views
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; 
    } 
} 

构造是不存在,所以应该实例化是不可能的。

但是我不确定是否要让我的班结束。也许(不一定)我想在将来扩展它(例如,公共类myClassB扩展myClass),这个关键字会阻止它 - 它必须在那里?

+0

不要忘记默认的构造函数。 – 2013-04-03 19:35:03

回答

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),这个关键字会阻止它 - 它必须在那里?

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

+0

+1“你只应该为了多态性而扩展你的班级。” – 2013-04-03 20:26:51

1

除了制作每种方法static之外,还将该类标记为abstract。这将阻止它被实例化。

abstract public class MyClass { 
    ... 
} 

创建一个私有的构造将防止外MyClass类从构建它,但不会从做停止的方法之一,从MyClass内(私有构造函数的类本身可见)。

0

使用抽象而不是最终。

2

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

否 - 如果没有声明的构造,那么Java自动给出类的隐含默认构造函数,没有正式的参数和无throws条款(JLS §8.8.9)。您需要显式声明一个私有构造函数,以使该类不可能从外部实例化。至于你的第二个担忧:扩展一个不可能实例化的类是没有意义的,因此将你的类声明为final是合理的 - 尽管这不是使它不可实例化的必要条件。

您可能会发现以下有关JLS的部分:§8.8.10: Preventing Instantiation of a Class

+0

此外,默认构造函数将不得不在其主体中抛出运行时异常,否则可以通过反射来实例化类。 – Perception 2013-04-03 19:39:36

0

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

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

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

该方法听起来很野蛮,但在形式上它会起作用。

+1

是的......好的......但将此构造函数设置为私有的,否则它在类的公共部分中,它应该像一个道德合约一样工作......想象一下情况:“你好,我给你一个好吸引人的构造函数供你使用,它是诱人的不是吗?使用它!是的,你现在进入我的超级陷阱构造函数和BOOM!E​​xception!MWAHAHAHAHA!“ – Steph 2013-04-03 19:54:20

+0

我知道,只是想着替代百万倍的讨论架构。实际上这个问题又被讨论了一百万次 - 只是想要一些新的想法。 – 2013-04-03 20:02:09

相关问题