2010-04-19 124 views
1

在我的项目,我有这样的类:Java级联枚举?

class Statut { 
    String satDomain; 
    String staCode; 
} 

但是字符串的处理是不是我想要的。这太过于自负,使用常量是不够的。

我想用枚举,但发现一个问题:

class Statut { 
    Domain satDomain; 
    StatutCode staCode; 
} 
enum Domain { } 
enum StatutCode { } 

这个解决方案是更好的,但你可以设置一个StatutCode,是不是在选定的领域。

您是否在您的项目中找到了解决此类问题的解决方案?

感谢您的帮助

Fluminis

+1

所以很简单,明确:对域名每个值都有一组离散与它相关StatutCode值?他们是不同的一个域到另一个? – Syntactic 2010-04-19 14:27:08

+0

就是这样。但现在,与Strings一起工作是非常麻烦的,我试图改进它。 – flumins 2010-04-20 06:55:51

回答

3

对extraneon的答案实际上略有改善。

先定义StatutCode枚举,然后为每个Domain枚举值分配EnumSet < StatutCode>。然后验证是Statut构造

enum StatutCode 
{ 
    ONE, 
    TWO, 
    THREE, 
    FOUR 
}; 

enum Domain 
{ 
    DOMAIN_1(EnumSet.of(StatutCode.ONE, StatutCode.TWO)), 
    ... 
    DOMAIN_N(EnumSet.of(StatutCode.TWO, StatutCode.THREE)); 

    private final EnumSet< StatutCode> validStatCodes; 

    Domain(EnumSet<StatutCode> validStatCodes) 
    { 
    this.validStatCodes = validStatCodes; 
    } 

    public boolean isValidCode (final StatutCode code) 
    { 
    return validStatCodes.contains(code); 
    } 
} 

class Statut { 
    final Domain staDomain; 
    final StatutCode staCode; 

    Statut(
     final Domain staDomain, 
     final StatutCode staCode 
    ) 
    { 
     if (! staDomain.isValidCode(staCode)) 
     { 
     throw new IllegalArgumentException(
      "Invalid code " + staCode + " for domain " + staDomain 
     ); 
     } 

     this.staDomain = staDomain; 
     this.staCode = staCode; 
    } 

} 
+0

是啊!好的解决方案 我会试试这个。谢谢 – flumins 2010-04-20 06:46:08

2

我建议让您的领域privatefinal并添加一个构造函数的验证,所构建的对象是良好的。

+0

为什么不行,但在项目的背景下是不可能的。实际上,我有一个服务调用数据库来获取定义如下的完整Statut对象: List findStatus(String domain,List staCodes); 或类似的第二个例子 列表 findStatus(域域,列表 staCodes); 我调用该方法是这样的: findStatus(MyConst.DOMAIN_1,Arrays.asList(MyConst.STA_CODE_1,MyConst.STA_CODE_2)) 我希望自己被链接到域的常量... – flumins 2010-04-19 14:46:54

+0

@flumins似乎有用您处理数据库的方式来解决架构问题。 – 2010-04-19 14:54:39

+0

你是对的,模型有点混乱,但我认为这种情况也会出现在其他项目中,不是吗? – flumins 2010-04-19 15:36:45

2

我通常不会发现这个问题。我倾向于使用不可修改的验证映射< Domain,StatutCode >()`如果运行时验证足够,或者内容从数据库中提取。

您可以在Statut上添加这样一个验证器。制作唯一的设置器,如setDomainAndStatutCode(Domain domain, StatutCode statutCode),并检查输入是否有效。我想使用enum DomainAndStatutCode。 Lot的工作和维护当然,所以真的不是一个很好的解决方案。如果数据集是有限的并且正确性是必须的,那么可能会很好。

+0

+1。唯一的建议,因为'域'将是一个枚举,使用'EnumMap'(而不是'HashMap')验证地图。它效率更高。 – 2010-04-19 16:11:36