2012-10-22 48 views
0

儘管我們都明白在界面中聲明常量(爲了簡潔起見)與類相對而言是邪惡的,因爲它會污染Java 5的命名空間您可以使用靜態導入來減少冗長(Effective Java Item 17)。然而,我的一位同事指出,在類中定義變量時,開發人員可能會錯過將變量聲明爲final(public和static可以打折,因爲它不存在彙編錯誤),而它們隱式地用於接口。任何爭論/反對它?我想這可能已經被詳細討論過了,因爲它似乎很簡單,但我的google-fu今天沒有幫助我:)。如果有人能夠在這裏發表意見,或者將我指向可能已經討論過的地方,我將不勝感激。在接口類中定義常量以避免意外丟失公共靜態最終指令

在此先感謝!

編輯: 這樣定義的接口文件將不會在其客戶端的類層次結構中使用,而是純粹用於容納常量。

+1

我喜歡使用內部接口(=類內的公共接口)來避免這兩個缺點(污染和意外使const變量)。不過,我沒有鏈接進行討論。 – Fildor

+0

這是一個不錯的方法,雖然不知道它看起來多麼可讀:) – Kilokahn

回答

0

如果使用後期Java 5 SDK,那麼爲什麼不計算枚舉而不是使用接口來定義公共靜態常量。儘管如此,這種方法沒有錯。

0

我不認爲在界面中定義常量是邪惡的。如果有的話,在公共類中實現一個常量接口是邪惡的。 然而,這給我們留下了很多其他不錯的選擇

  • 您可以擴展接口來添加更多的常量
    • 例如,接口定義了衆所周知的屬性名稱。然後你可以有一個子接口,添加特定於你的實現的屬性。
    • 常量類通常具有私有構造函數,這使得子類化變得不可能。
  • 並非我所有的類都是(public)API的一部分。如果內部類實現了一個常量接口,我認爲它並不重要。
  • 比方說一個方法期望常量的方法參數: myXmlProcessor.setProperty(XMLOptions.VALIDATING, true)
    • 你怎麼知道從哪裏獲取的常量?通常,有幾個常量類,這會使風險錯誤地使用。
    • myXmlProcessor.setProperty(MyXMLProcessor.VALIDATING, true):在這裏你知道它是正確的。
  • 如果您有一個類層次結構並且基類實現了常量接口,它們將自動可用於子類。再次,錯誤的空間較小。
+0

我對你提到的其他選項有一些擔憂:1.擴展或層次結構不適用於此。本課程包含所有DAO返回的MAX_ROWS項目。沒有共同的基礎課程,因此需要將其安置在自己的班級中。 2.我沒有使用它來公開API,而是保持代碼可讀。 3.通過使用枚舉可以很容易地獲得方法參數,而不是像Strings那樣混淆基元。 4。再次,沒有層次結構。 – Kilokahn

+0

1)什麼是「這裏」和「這堂課」?你的問題沒有給出任何背景。如果你問通用的問題,請期待一般的答案。 2)我正是這麼說的。 3)如果值的範圍是固定的,當然你應該使用枚舉。但枚舉並不總是削減它,這是常數的點。 – Cephalopod

+0

感謝您的意見。我試圖在編輯中注意到它不會被客戶使用或屬於層次結構,抱歉沒有儘早做。對於#2,任何內部類實現一個常量接口似乎都是不正確的,因爲它似乎不滿足語義上的is-a契約。感謝您指出,請與#3同意。 – Kilokahn