2

在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或一堆整数等来执行此操作的首选方式?

4

4 回答 4

5

Java有枚举。这是教程

我会在整数等上使用这些。这是一个类型安全的解决方案,并且由于枚举是对象,您可以附加行为并避免switch语句。

您可以使用EnumSet组合这些(如上)。从文档:

用于枚举类型的专用 Set 实现....这种表示非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它用作传统的基于 int 的“位标志”的高质量、类型安全的替代品。

于 2012-07-20T15:11:02.317 回答
3

Brian Agnew的答案是正确的。Java 有一个强大、灵活且非常方便的Enum工具。(不要与现在过时的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 );

跑的时候。

成分:[可乐、果汁、水]

请记住,这些是真实的对象、类型安全的、编译器强制执行的、静态定义的和自记录的。不要将它们误认为仅仅是字符串。

于 2016-04-10T08:20:52.390 回答
0

您还拥有Java EnumMap,因此您可以在将它们的总和传递给您的方法之前从您的饮料所需EnumMap的所有值中获取值USE_XXX

于 2012-07-20T15:41:01.163 回答
-1

有多种选择可以实现这一点。

  • 我个人喜欢 C 风格的位操作方式,只是创建一个枚举或一组最终静态。
  • Java 中的另一个选项是使用java.util.BitSet对象。
  • 从真正的 OOP 视图来看,最简洁的方法可能是实现一个带有布尔 getter/setter 的实用程序类。然后将该实用程序类传递给需要使用标志的对象。
于 2012-07-20T15:19:05.903 回答