【问题标题】:Can be non-primitive type considered constant in Java?可以在Java中将非原始类型视为常量吗?
【发布时间】:2014-09-29 12:48:56
【问题描述】:

可以表达

private static final String[] ARRAY = new String[]{"Word1", "Word2"};

在 Java 中被视为常量?常量不只是原始类型吗?在这种情况下使用大写字母是否不当且具有误导性?

编辑:添加了我最初忘记的 private static final 部分。很明显,给定的数组是可以改变的。这个问题的原因是我在代码中看到了这种(不正确的)用法,我想确认我的假设。

【问题讨论】:

  • 问自己这个问题。我可以更改ARRAY 的值吗?如果是,那么它不是一个常数。
  • 常量表示谁的值不能改变。所以我们在这种情况下使用 final 关键字 private final static pie=3.14。而变量意味着它的值是可变的。

标签: java naming-conventions constants


【解决方案1】:

在Java中可以认为是常量吗?

没有。

首先,如果变量不是final,你可以给它赋值。

(这就是我最初回答的问题版本中的声明。)

其次,即使您将变量声明为final,也可以轻松更改数组的内容。所有 Java 数组都是可变的。

包含引用的变量是常量。对象(或类型)不是常量。

常量不只是原始类型吗?

实际上,没有。 final String 字段也是常量。 (它甚至可以用在常量表达式中。)

事实上,任何包含对不可变对象的引用的final 变量也可以被视为常量。

在这种情况下使用大写字母是否不当和误导?

是的。根据 Java 样式指南,大写 + 下划线模式仅适用于作为属性的变量,即 staticfinal,它们要么是原语,要么是对不可变对象的引用。您的示例在至少三个(如果不是全部四个)要求上都失败了。

【讨论】:

    【解决方案2】:

    特别是,这不是一个常数,因为如果你可以访问数组,你可以很容易地做到:

    ARRAY = new String[]({"Word3"};
    

    大写字母不会使变量成为常数。但是,final 修饰符确实:

    final String[] ARRAY = new String[]{"Word1", "Word2"};
    

    作为旁注,您可以查看difference between constant and immutable objects 是什么。

    【讨论】:

      【解决方案3】:

      虽然 String 不是直接的原始数据类型(尽管 Char 是),但它在某些方面作为原始数据类型起作用。所以,如果你对这个类型使用 final 关键字,它会使其保持不变。

      final String[] ARRAY = new String[]{"Word1", "Word2"};
      

      但是对于非原始类型,final 关键字不会使对象属性成为最终的,它只是使对对象的引用成为最终的。

      想想鸟类型。比如说,它有腿这样的属性。

      Public class Bird{
      int leg=2;
      setLegs(int legs){
      this.legs=legs};
      }
      

      现在,如果你用关键字 final 初始化一个 Bird,比如 Parrot,默认情况下它将具有类似 leg=2 的属性。现在,引用是最终的(Parrot 将始终引用 Bird 类型),但您仍然可以更改此对象的属性,例如:

      final Bird Parrot = new Bird();
      
      Parrot.setlegs(3); 
      

      将腿数更改为 3。

      如果你想保持腿数也是最终的,那么你也需要将它用于腿变量,比如:

      Public class Bird{
      final int leg=2;
      setLegs(int legs){
      this.legs=legs};
      }
      

      不管怎样,我自己不喜欢玩鸟腿,例如!

      【讨论】:

      • 这是不正确的。数组引用是恒定的,字符串是不可变的....但是数组可以很容易地改变。它不是恒定的……根据这个词的正常含义。
      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多