用于将标志传递给对象的正确设计模式

时间:2012-07-20 15:08:46

标签: java oop design-patterns enum-flags

在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 个答案:

答案 0 :(得分:4)

Java有枚举。这是tutorial

我会使用这些over int等。它是一种类型安全的解决方案,由于枚举是对象,因此您可以附加行为并避免使用switch语句。

您可以使用EnumSet组合这些(如上所述)。来自doc:

  

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

答案 1 :(得分:0)

您还有Java EnumMap,因此您可以从饮料所需的所有EnumMap USE_XXX中获取价值,然后将其总和转换为您的方法

答案 2 :(得分:-1)

有多种方法可以实现这一点。

  • 我个人喜欢C风格的位操作方式,只需创建一个枚举或一组最终静态。
  • Java中的另一个选择是使用java.util.BitSet对象。
  • 从真正的OOP视图中最干净的可能是使用布尔getter / setter实现一个实用程序类。然后,该实用程序类将传递给需要使用标志的对象。