在Java中可以认为是非原始类型的常量吗?

时间:2014-09-29 12:48:56

标签: java naming-conventions constants

可以表达

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

在Java中被视为常量?不是常数只是原始类型?在这种情况下使用大写字母是否不恰当和误导?

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

3 个答案:

答案 0 :(得分:3)

特别是,这不是常数,因为如果你可以访问数组,你可以轻松地做到:

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

大写字母不能使变量成为常数。但是,final修饰符可以:

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

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

的内容

答案 1 :(得分:2)

  

它可以被认为是Java中的常量吗?

没有

首先,由于变量不是final,您可以分配给它。

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

  

不仅仅是原始类型的常量吗?

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

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

  

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

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

答案 2 :(得分:1)

虽然String不是直接的原始数据类型(虽然是Char),但它在某些方面可以作为原始数据类型。因此,如果您对此类型使用final关键字,则会使其保持不变。

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

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

想想Bird类型。说,它有像腿一样的属性。

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

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

final Bird Parrot = new Bird();

Parrot.setlegs(3); 

将腿数改为3.

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

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

无论如何,我自己也不喜欢玩鸟腿,仅举例来说!