【问题标题】:Is it possible to have enumeration values as private static final constants in Java?是否可以将枚举值作为 Java 中的私有静态最终常量?
【发布时间】:2020-03-06 02:56:20
【问题描述】:

是否可以将枚举值作为 Java 中的私有静态最终常量?

我目前正在为 Issue 类编写一个 IssueTest 类。在问题类中,我有一个问题类型的内部枚举,它可能是一个错误或增强。

public enum IssueType {
        ENHANCEMENT,
        BUG;
}

在问题的构造函数之一中,参数之一是问题类型。

public Issue(IssueType type, String state, String summary) {

}

我正在尝试编写一个案例来测试这个构造函数。在我的测试类中,我尝试像这样为 IssueTypes 创建一个常量

private static final IssueType TYPE_BUG = BUG;  
private static final IssueType TYPE_ENHANCEMENT = ENHANCEMENT;

但是这些行会产生编译器错误。我不确定如何在我的测试类中使用 IssueType 常量来测试构造函数。非常感谢任何指导!

【问题讨论】:

  • 您可能希望它成为public static enum。然后在测试类中,可以写YourClass.IssueType.ENHANCEMENT。没有必要为此添加额外的变量。
  • @DawoodsaysreinstateMonica 枚举不是隐式静态的吗?
  • 你可以像new Issue(IssueType.BUG, "OPEN", "summary");一样创建你的对象。如果我是你,我不会费心创建一个变量来存储枚举值。枚举非常易读,IssueType.BUG 准确地说明了它是什么。
  • 是的,嵌套枚举类型是implicitly static。如果 OP 不喜欢 IssueType.BUG,他可以将 Issue.IssueType.* 静态导入到测试类中。
  • 您忘记告诉我们编译器错误是什么,但您需要IssueType TYPE_BUG = IssueType.BUG。但是您实际上根本不需要这些静态决赛。只需使用适当的限定枚举值。你真的只是用这种双重谈话来混淆你的代码。

标签: java enums constants


【解决方案1】:

正如其他人之前所说,您不应该在测试中创建多余的 static final 成员,但如果您坚持可以。如果正确完成,应该不会有任何编译器错误。

我的小MCVE 展示了如何同时使用冗余静态字段和优雅地直接使用枚举常量:

package de.scrum_master.stackoverflow.q60556923;

public class Issue {
  public enum IssueType {
    ENHANCEMENT,
    BUG
  }

  public Issue(IssueType type, String state, String summary) {}
}
package de.scrum_master.stackoverflow.q60482676;

import de.scrum_master.stackoverflow.q60556923.Issue.IssueType;
import org.junit.Test;

import static de.scrum_master.stackoverflow.q60556923.Issue.IssueType.*;
import static org.junit.Assert.assertEquals;

public class IssueTest {
  // Seriously?! Nah, rather not.
  private static final IssueType TYPE_BUG = BUG;
  private static final IssueType TYPE_ENHANCEMENT = ENHANCEMENT;

  @Test
  public void testUsingStaticFinal() {
    // Does this make anything better or just obfuscate and complicate the test?
    assertEquals("BUG", TYPE_BUG.toString());
    assertEquals("ENHANCEMENT", TYPE_ENHANCEMENT.toString());
  }

  @Test
  public void testUsingEnumDirectly() {
    assertEquals("BUG", BUG.toString());
    assertEquals("ENHANCEMENT", ENHANCEMENT.toString());
  }
}

【讨论】:

  • 希望 OP 的测试不仅仅只是测试这些平台。
  • 当然。他说他在使用static IssueType 成员时遇到编译错误。我只是表明(a)正确完成时没有编译错误,并且(b)使用那些冗余的静态成员是完全没有必要的。这就是为什么它被称为MCVE。如果他没有透露更多关于被测课程的详细信息,我还应该测试什么?
  • 当然,我赞成你的回答,只是一个旁注。
  • 并不是说它如此重要,但还没有人对我的回答投任何票。 ?
  • 谢谢!这很有帮助!抱歉这个愚蠢的问题,我是初学者。
猜你喜欢
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2011-01-14
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多