2012-07-20 87 views
1

在C正確的設計模式,我已經做了這樣的事情傳遞標誌爲對象

enum { USE_COKE = 1, 
     USE_PEPSI = 2, 
     USE_JUICE = 4, 
     USE_WATER = 8 }; 

int makeDrink(int flags); 

//... 

int rcode = makeDrink(USE_COKE | USE_JUICE | USE_WATER); 

我知道這是非常標準的,它也是iostream例如使用。我想知道如何將這種設計模式轉換爲Java或OOP?我是漂亮的當然,多態性並不是我們走到這裏的方法,因爲我的代碼有更好的if(flag_is_set)塊,而不是重寫大部分例程。是否有實用程序Flags類,或使用配置對象或enum或一串整數等來執行此操作的首選方法。

+3

您不需要Java中的標誌,只需使用[EnumSet](http://docs.oracle.com/javase/6/docs/api/java/util/EnumSet.html) – 2012-07-20 15:13:18

回答

4

Java有枚舉。這是tutorial

我會使用這些ints等這是一個類型安全的解決方案,因爲枚舉是對象,你可以附加行爲,並避免switch陳述。您可以使用EnumSet組合這些(如上)。來自doc:

專門用於枚舉類型的Set實現....此 表示非常緊湊和高效。這個類的空間和時間 應該足夠好,以允許它作爲 高品質,類型安全替代傳統基於int的「位 標誌」使用。

+0

如何閱讀? 'if(enumSet.contains(enumValue))'不起作用。我顯然還在學習Java中的枚舉如何工作。 編輯:弄明白了,我忘了你必須用枚舉類型名稱來限定枚舉。 – djechlin 2012-07-20 15:23:23

0

有多種選擇來實現這一點。

  • 我個人喜歡C風格的位操作方式,只是創建一個枚舉或一組最終靜態。
  • Java中的另一個選項是使用java.util.BitSet對象。
  • 也許從真正的OOP視圖來看最清潔的就是用布爾型getter/setter來實現一個實用工具類。該實用程序類將被傳遞給需要使用標誌的對象。
0

你也Java EnumMap,這樣你就可以得到的EnumMap價值全部的款項前,傳遞給你的方法

1

Answer by Brian Agnew是正確的需要爲您的飲料USE_XXX。 Java擁有功能強大,靈活且簡單易用的工具。 (不要與現已過時Enumeration接口相混淆。)

示例代碼

下面是基於該問題的示例代碼。

public enum Liquid { 
    COKE, PEPSI, JUICE, WATER 
} 

該枚舉類型爲EnumSet的方法。

public Drink makeDrink (EnumSet<Liquid> ingredients) { 
    System.out.println ("ingredients: " + ingredients); 
    if (ingredients.contains (Liquid.JUICE)) { 
     // Treat as a Collection. 
     // `EnumSet` is just another `Set` implementation, though a very fast one. 
    } 
    for (Liquid ingredient : ingredients) { 
     // Access each item in the collection, each Liquid object in the EnumSet. 
    } 
} 

代碼調用該方法,實例化並傳遞必要的EnumSet

EnumSet ingredients = EnumSet.of (Liquid.COKE , Liquid.JUICE , Liquid.WATER); 
Drink drink = this.makeDrink (ingredients); 

運行時。

成分:可樂,果汁,水]

請記住,這些都是真正的對象,類型安全,編譯器執行,靜態定義,和自我記錄。不要把它們誤認爲單純的字符串。