Java 级联枚举?

发布于 2024-08-29 18:27:50 字数 398 浏览 1 评论 0原文

在我的项目中,我有这样的课程:

class Statut {
    String satDomain;
    String staCode;
}

但是使用字符串并不是我想要的。它过于宽松,并且使用常量是不够的。

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

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

此解决方案要好得多,但您可以设置不在所选域中的 StatutCode。

您在项目中找到解决此类问题的方法了吗?

感谢您的帮助

弗鲁米尼斯

In my project, I have such class :

class Statut {
    String satDomain;
    String staCode;
}

But working with Strings is not what I want. It is too permisive and using constants is not enough.

I wanted to use enums but find a problem :

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

This solution is far better, but you can set a StatutCode that is not in the selected Domain.

Did you find a solution in your project to such problem ?

Thank for your help

Fluminis

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

围归者 2024-09-05 18:27:50

实际上对 Extraneon 的答案略有改进。

先定义StatutCode枚举,然后赋值EnumSet<法规代码>每个 Domain 枚举值。然后在 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;
    }

}

Actually slight improvement on extraneon's answer.

Define StatutCode enum first, and then assign EnumSet< StatutCode > to each Domain enum value. Then the validation is pretty simple in Statut constructor

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;
    }

}
若水微香 2024-09-05 18:27:50

我建议将您的字段设为 privatefinal 并添加一个构造函数来验证构造的对象是否格式良好。

I suggest making your fields private and final and adding a constructor the verifies that the constructed object is well-formed.

千紇 2024-09-05 18:27:50

我通常不认为这是一个问题。如果运行时验证足够,或者从数据库中提取内容,我倾向于使用不可修改的验证 Map()`。

您可以在 Statut 上添加这样的验证器。创建像 setDomainAndStatutCode(Domain domain, StatutCode statutCode) 这样的唯一 setter 并检查输入是否有效。

否则我会使用enum DomainAndStatutCode。当然,需要大量的工作和维护,所以这确实不是一个好的解决方案。如果数据集有限并且必须保证正确性,这可能会很好。

I don't usually find that a problem. I tend to use a unmodifiable validation Map<Domain,StatutCode>()` if run-time validation is sufficient, or the contents is pulled from a database.

You could add such a validator on Statut. Make the only setter like setDomainAndStatutCode(Domain domain, StatutCode statutCode) and check whether the input is valid.

Otherwise I'd use an enum DomainAndStatutCode. Lot's of work and maintenance of course, so really not a nice solution. Might be good if the dataset is limited and correctness is a must.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文