2012-07-20 75 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); 

运行时。

成分:可乐,果汁,水]

请记住,这些都是真正的对象,类型安全,编译器执行,静态定义,和自我记录。不要把它们误认为单纯的字符串。