【问题标题】:what is the proper way of declaring arrays in a class in Java在Java类中声明数组的正确方法是什么
【发布时间】:2012-05-11 15:35:03
【问题描述】:

在类中声明常量数组的正确方法是什么?我已经阅读了 ppl 为

辩护的帖子
public static final Strings[] words;

点赞here

但是,我发现将变量声明为公开,这意味着用户(测试人员)可以看到变量;即使,他不能改变它们,因为它们是最终的......任何人都可以解释为什么我应该声明上述常量而不是

private static final Strings[] words;

或者只是

private final Strings[] words;

谢谢

【问题讨论】:

  • 变量的用途是什么?

标签: java arrays constants


【解决方案1】:

通常你不应该在 Java 中使用数组,除非你真的需要性能。

您应该改用Collection(或List,如果已订购)。

对于公共常量,

public static final Collection<String> FIXED_STRINGS = Collections.unmodifiableCollection(Arrays.asList("string1","string2"));

private,如果它不用于课堂外。

【讨论】:

  • 如果你要让它不可修改,为什么还要麻烦收藏呢?那时,您本可以为自己节省精力和 JVM 时间,然后直接使用 public static final String[] STRINGS = {"string1", "string2"};
  • @josh.trow 数组不能成为不可变的,所以有人可以这样做STRINGS[1] = "badString"
【解决方案2】:

您指向的示例谈论公共String 常量,而不是公共String[]

你不能让String[] 不变。 final 仅表示用户不能将引用指向不同的对象。它不会阻止用户更改数组的内容。 (Java 中的 final 与 C++ 中的 const 非常不同(并且功能更弱)。

至于static是否应该在那里,记住有什么区别。使用static,该成员将由该类的所有实例共享。如果没有static,类的每个实例中都会有一个单独的成员副本。

通常当某些东西是浪费的真正常量时,因此在这种情况下通常使用static

【讨论】:

    【解决方案3】:

    这取决于你想做什么,就像任何面向对象的概念一样。

    public/private/... 是您要向您的成员/方法声明的访问权限。

    BTW final 表示一旦初始化就不能更改变量。 static 表示该类的所有实例都将具有相同的变量。

    总之,一切皆有可能。

    【讨论】:

      【解决方案4】:

      我更喜欢使用枚举来声明常量:

      public enum Words {
      
          ONE("one"),
          TWO("two");
      
          private String title;
      
          private Words(String title){
              this.title = title;
          }
      
          public String getTitle() {
              return title;
          }
      }
      

      使用起来非常方便(Words.ONE),您可以将其他属性与每个属性(标题等)相关联。

      也可以通过调用 Words.values(); 来获取常量数组;

      【讨论】:

      • 这与声明数组无关
      • 是的。您可以在枚举上调用 .values() 以获取所有枚举值的数组。
      【解决方案5】:

      不鼓励将类变量声明为 public,因为这并不能清楚地表明它们是类变量。

      它还向其他编写依赖于该特定类变量的代码的人开放您的类。

      【讨论】:

        【解决方案6】:

        您知道 static 或 final 关键字的作用吗,因为它没有显示在您的问题中!

        首先了解静态和最终!

        它应该是 static final 因为只有它才会真正持有一些 意味着成为一个常数!

        顺便说一句,“字符串”??

        【讨论】:

          【解决方案7】:

          由于 String [] words 是最终的,您可以将其初始化一次,即如果您说 string [] words=new string[5] 或者您以任何其他方式对其进行了初始化,但是一旦初始化,您就无法使其引用字符串数组的其他实例。 但它的元素可以改变。
          例如 words[0]="string1" 可以更改为 words[0]="string2" 如果您说
          private static final string[] words 那么 words 将成为类变量并且可以在类内访问。
          如果你说
          private final string [] words 那么 words 将成为实例变量并且可以在 class
          中访问 如果你说变量是公共的,那么它可以被外部类访问,并且它的元素可以被任何人修改。
          推荐
          1.使用枚举
          2. 使用列表并使用 Collections.unmodifiableList() 使其不可修改

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-09
            • 2016-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多