【问题标题】:Use a static variable or method for a constant array in Java在 Java 中为常量数组使用静态变量或方法
【发布时间】:2014-05-13 09:16:05
【问题描述】:

我想知道使用 final 静态变量或方法在 Java 中提供常量数组是否更好。

假设我们有:

public class myColor {
    public final static String[] COLOR_NAMES = new String[] {"red", "green"};
    public final static String[] colorNames() {return new String[] {"red", "green"};}
}

对我来说,第二个的缺点是每次调用它都会创建一个新的字符串数组。但是第一个有缺点,任何人都可以做到COLOR_NAMES[0] = "blue"

澄清一下:我特别想提供一个颜色名称列表,以供后续使用正则表达式进行匹配。

有什么方法可以解决这个问题?

【问题讨论】:

  • 这是使用Enum的示例
  • 但第一个有缺点,任何人都可以做 COLOR_NAMES[0] = "blue"。 为什么这是一个缺点?这是一个最终数组不是吗?
  • 或者使用枚举...也许?
  • @cbach 数组是最终的,但不是它的内容。

标签: java arrays static constants


【解决方案1】:

你可以使用枚举

public enum Color{ 

  RED("red"), GREEN("green");
   final String color;

  Color(String color) {
    this.color=color;
  }

  public String getColor() {
    return color;
  }
 }

【讨论】:

  • 您可以将color 设为最终和私有。
  • 如何获取所有已定义枚举名称的列表/数组?
  • Color.values() 将返回所有枚举的Color[]
  • 好的,但我必须将它们转换为字符串数组 --> 并不比首先使用方法更好。虽然我承认枚举更优雅。
【解决方案2】:

如果您可以使用列表,则一种选择是:

public final static List<String> COLOR_NAMES = Collections.unmodifiableList(
                                                   Arrays.asList("red", "green"));

如果需要,您总是可以得到一个数组:

String[] array = COLOR_NAMES.toArray(new String[0]);

否则你的第二个选项很好,虽然我会写它:

private final String[] COLOR_NAMES = {"red", "green"};
public static String[] getColorNames() { return COLOR_NAMES.clone(); }

【讨论】:

  • 一个不可修改的列表确实可能是最好的解决方案,谢谢。考虑到第二个选项,它表现得更好,还是一种风格? :-)
  • @Jay 风格。它的作用与您的代码完全相同,但如果您必须添加一种颜色,您只需要更改一个数组而不是两个。
【解决方案3】:

这个问题适合使用Enum。就我个人而言,我不会为此使用任何方法。但是天气静态数组是很好的解决方案吗?最好使用java enums 解决它。

【讨论】:

    【解决方案4】:

    要在构造时初始化数组,您可以在花括号中指定列表值:

    private static final String[] STRING_ARRAY = {"red", "green", "blue"};
    

    在我的示例中,我假设您不想更改数组的实例,因此已将其声明为 final。您仍然可以像这样更新单个条目:

     array[0] = "1";
    

    但是您将无法完全用不同的数组替换该数组。如果值会发生很大变化——尤其是如果值的数量会发生变化——那么可能值得考虑使用 List

    【讨论】:

    • 这如何回答这个问题? OP 表明他已经知道如何在常数时间初始化一个数组,并且他有兴趣提供一个 constant 数组。
    • 感谢您指出 new String[] 不是静态初始化所必需的。不知道,但它没有回答我的问题。
    • @Jay 我相信 Sanjay 写的只是语法糖; new String[] 仍然存在,但“隐藏”
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2019-03-10
    相关资源
    最近更新 更多