簡體   English   中英

使用java中的方法的單個實例

[英]Single instance with methods in java

我想知道編程決策 - 我認為這是風格問題。 我需要有一個只有方法而沒有屬性的類的單個實例。 要在java中獲得它,我有兩個選擇:

  1. 使用靜態方法創建一個抽象類,因此不可能創建該類的任何實例,這很好,
  2. 使用公共方法的單例模式。

我傾向於采用第二種方法,盡管遇到1.哪種以及為什么這些更好,或者有第三種選擇。

這個單例實現一個接口是否有意義,允許你模擬這些方法用於測試目的?

我知道這些日子反對測試教條,但在某些情況下我認為靜態方法很好。 如果這是一種你永遠不想為了測試目的而假裝的行為,並且它永遠不會與其他實現一起變成多態,我認為制作一個單例並不重要。 (單身人士通常也是可測試性的敵人,盡管如果你只在代碼的注入部分直接引用它們,他們就可以實現適當的接口,這樣他們的單一性就不會成為問題。)

值得一提的是,C#在這種情況下具有“靜態類” - 它們不僅禁止其他代碼派生或實例化類,而且甚至不能將它用作參數。 基本上它非常清楚地表明意圖。

我肯定建議至少有一個私有構造函數來防止外部世界的實例化。

我個人認為,該類應該包含一個私有構造函數,而不是抽象的。 摘要向讀者建議某個地方有一個具體的版本,他們可能會浪費時間去尋找它。 我還要確保你有效地評論你的代碼。

public class myClass {

   /** This class should never be instantiated. */
   private myClass() {
   }

   public static void myMethod() {

   }

   ...
   //etc
   ...
}

對於選項#1,限制靜態實用程序類的實例化可能甚至不重要。 因為它只有靜態方法而且沒有狀態,所以沒有任何意義 - 但是沒有任何傷害 - 實例化它。 類似地,靜態方法不能被覆蓋,因此如果它是子類,則沒有意義 - 也沒有區別。

如果它有任何狀態 - 或者如果它有可能在某一天獲得有狀態 - 那么將它作為普通類實現可能會更好。 我仍然不希望將它用作Singleton,而是通過依賴注入傳遞其唯一的實例。 從長遠來看,這使得單元測試變得更加容易。

如果它保持狀態,我將使用帶有私有構造函數的單例模式,因此您只能從類中實例化。 如果它沒有狀態,比如apache commons實用程序類,我會使用靜態方法。

我從未見過靜態方法的問題。 您可以將靜態方法視為以某種方式破壞OO,但如果您將靜態視為某種無狀態的標記,它們就會非常有意義。 你可以在Java apis中找到這個,比如java.Math。 如果您擔心子類化,您可以始終將其作為最終。

存在這樣的危險:像這樣的類可能最終成為“實用方法垃圾箱”,但只要功能不會分散太多,那么它就沒有任何問題。

它也更清晰,因為沒有必要像使用單例一樣管理對象生命周期(並且由於沒有狀態,無論如何都有什么意義?)。

對於單個實例,我建議你有一個枚舉,有一個實例。

但是,對於沒有屬性的類,您不必擁有實例。 您可以使用實用程序類。 您可以使用枚舉,沒有實例,只有靜態方法。 注意:這不容易被嘲笑。

如果您需要在測試中模擬實現,您仍然可以實現接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM