2012-07-24 77 views
11

在Java中在抽象類中使用私有構造函數的目的是什麼?抽象類中的私有構造函數

我覺得這個問題,我很好奇,需要以這種方式使用構造函數是什麼情況?

我認爲它可以與抽象類中的另一個構造函數配對使用,但這非常簡單。它也可以用於構建靜態的內部類,它將優於抽象類。

也許有更優雅的用法?

+0

我沒有對這個問題投票,但我懷疑人們downvoting反對*「也許有更優雅的用法」* - 這是相當廣泛的,聽起來頗具修辭性。 – Flexo 2012-07-24 07:05:09

+2

問題是:*「在Java中,在抽象類中使用私有構造函數的目的是什麼?」*。這對我來說似乎足夠具體。 – assylias 2012-07-24 07:07:48

+0

Thx回覆,可能你是對的。 – Chris 2012-07-24 07:08:19

回答

27

如果private構造函數是類的只有構造函數,那麼原因很明顯:防止子類。某些類僅用作靜態字段/方法的持有者,不想實例化或分類。請注意0​​修飾符在這種情況下是冗餘的—有或沒​​有它將不會有實例化。正如@JB Nizet在下面注意到的,abstract修飾符也是不好的做法,因爲它會向班級的客戶端發送錯誤的信號。實際上該班應該是final

還有另一種使用情況下,相當罕見,但:你可以有一個abstract class只有private構造函數包含自己的子類作爲嵌套類。這個成語確保這些嵌套類是唯一的子類。事實上,Java中的enum只是使用這個習慣用法。

如果還有其他的構造函數,那麼private構造函數沒有什麼特別之處。就像在其他類中一樣,它在abstract類中使用。

+0

我會說在這種情況下使用抽象不僅是多餘的,而且令人困惑。根據定義,抽象類是*表示*被分類的。製作一個抽象類但不可子類化的類表明對抽象的含義缺乏瞭解。 – 2012-07-24 07:38:40

+0

@JBNizet不一定缺乏理解,但可能缺乏注意力不要混淆你的客戶。順便提一下,我注意到我剛剛添加的第二段。這給「抽象」類中的「私人」提供了完美的動力。 – 2012-07-24 07:39:53

+2

好點。但我讀了upvoted ;-) – 2012-07-24 07:41:12

0

沒有其他優雅的使用成爲可能

6

我能想到的唯一的事情就是把通過其他(保護)構造共同的代碼。然後他們可以在第一行中調用私有構造函數。

2

有時,默認的無參數構造函數被設置爲私有的,並且提供了另一個接受參數的構造函數。這個構造函數可能會調用其他私有構造函數。這迫使實現提供這些參數,這可能確保某些變量始終被初始化,儘管這不是常見的做法(以我的經驗)。如果這是要求,你最好檢查你的變量並拋出一個IllegalArgumentExeption,解釋爲什麼變量需要被初始化。

如果你創建一個抽象類只有私人構造函數,類實際上沒有用,因爲沒有實例可以創建。如果意圖是僅使用靜態方法創建實用程序類(如java.lang包中的Math類),則可以使用私有構造函數,但是該類應該標記爲final,因爲將該類標記爲抽象意味着該類將是延長。

+2

但是,如果您明確提供了一個構造函數,則不存在默認的無參數構造函數,所以這並不是真正將其設置爲私有的原因。 – Thilo 2012-07-24 07:15:02

1
  1. 如前所述,用作通用的內部使用唯一構造函數。

  2. 抽象或不抽象,在一個只包含靜態公共方法[helper方法]的類上聲明一個私有的默認構造函數以防止實例化該類是很常見的。

+0

@Thilo - 我同意(3)不適用,我被帶走了 - 這將是(1)的延伸。 4有資格澄清它不直接適用於具體問題。 – 2012-07-24 07:38:29