2013-04-03 97 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

相關問題