在Java中创建一个枚举/最终类

5

我正在尝试找出创建一个类的最佳方法,其唯一目的是作为全局静态变量的容器。以下是一个简单示例的伪代码,以说明我的意思...

public class Symbols {
   public static final String ALPHA = "alpha";
   public static final String BETA = "beta";

   /* ...and so on for a bunch of these */
}

我不需要构造函数或方法。我只需要通过调用Symbols.ALPHA;就能够从任何地方访问这些“符号”。

确实需要字符串的实际值,所以我不能使用枚举类型。如何最好地实现这一点?


1
回复:'我确实需要字符串的实际值,所以我不能使用枚举类型。' - 您仍然可以从枚举类型获取字符串值... - Nate
@Nate...可以给我一个小例子吗?我的枚举技能有些生疏了。 - Hristo
Jon Skeet 发布的大部分内容都是我所说的——此外,您可以重写枚举的 'toString()' 方法,以返回枚举的“值”而不是枚举的“名称”,如果您想在类型安全和易于转换为字符串之间进行权衡。 - Nate
3个回答

10

除了将这个类声明为final并给它一个私有构造函数之外,你已经提供了所需的代码,但是需要注意的是还有什么其他需求并不明确。

然而,为了避免意外使用不合适的值,我建议你将其声明为枚举类型,像这样:

public enum Symbol {
   ALPHA("alpha"),
   BETA("beta");

   private final String value;

   private Symbol(String value) {
     this.value = value;
   }

   public String getValue() {
     return value;
   }
}

采用这种方式:

  • 您就不会意外地在需要字符串时使用Symbol.ALPHA
  • 您也不会意外地在需要符号时使用字符串
  • 您仍然可以轻松地获取与符号关联的字符串值
  • 如果需要,您可以根据不同的符号值进行切换

我正在考虑这种方法,但是你必须调用 getValue() 方法才能获得实际值,对吗? - Hristo
顺便提一下,Jon...我可能没有表达清楚,但我特别需要字符串值。 - Hristo
@Hristo:是的,你可以通过getValue()获取它。鉴于所列出的好处,调用getValue()真的那么糟糕吗? - Jon Skeet
@Jon... 哈哈,那不是我的决定。如果我能决定,我会这样做 :) 我问这个问题的原因是为了找出不同的方法来做到这一点,权衡利弊,并向那个将批准实施的人呈现选项。 - Hristo
@Hristo:那么你已经拥有了什么,但将类设为final并添加一个私有构造函数是正确的方法。 - Jon Skeet

4

您可以使用接口来实现此功能。无需构造函数,值为公共、静态和不可更改的,当然也可以是字符串。这样的接口看起来与您的类相似:

public interface Symbols {
  public static final String ALPHA = "alpha";
  public static final String BETA = "beta";
  /* and so on */
}

如果字段是公有的,你可以直接从代码的任何位置访问它们,例如Symbols.ALPHA

或者,即使你想要字符串,也可以使用枚举-ALPHA.toString()将返回"ALPHA"(如果你想要略微不同的字符串,可以重写toString())。


那么一个外部类需要实现这个接口吗? - Hristo
不需要实现它。它只是一个“常量持有者”,就像你正在寻找的一样。 - Ryan Stewart
@Hristo - 不,它可以使用接口名称 - Symbols.ALPHA 访问它们。 - Eran
嗯...我想这就是我正在寻找的。Jon Skeet在下面提出了一些很好的观点。对于他的建议,您有什么正反两方面的想法吗? - Hristo
@eran... 能否提供一个这样接口的小代码示例? - Hristo
@Hristo,我已经在答案中更新了这样一个接口的示例。 - Eran

0
这些是配置参数还是不管怎样都不会改变的“常量”?如果是前者,我宁愿创建一个配置类,并使用不同的值实例化它以适应每个环境。然后只需使用依赖注入将这些配置注入到不同的类中即可。如果您的要求是后者或者您没有使用DI(Spring/Guice),那么静态类/接口就可以了。

这些将属于常量类别,但是这个列表将会不断增长。 - Hristo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接