关于Java常量的困惑

cod*_*ser 1 java constants

我正在研究java编程,我对常量有点困惑.从我到目前为止所读到的常量是最终的,不能像变量一样重新分配新的值.但是,当我使用Calender类时,set方法似乎改变了一个常量字段.例如:

Calendar cal = Calendar.getInstance();
System.out.println("The year is " + cal.get(Calendar.YEAR));
cal.set(Calendar.YEAR, 2001);
System.out.println("The year is " + cal.get(Calendar.YEAR));
Run Code Online (Sandbox Code Playgroud)

如果在类中Calendar.YEAR声明final了该字段,Calendar那么为什么我可以使用set方法将其更改为其他值?

Jon*_*eet 5

Calendar.YEAR只是一个常数说明你要在日历中设置哪个逻辑字段.

目的是避免使用API

setYear
setDay
setMonth
...
Run Code Online (Sandbox Code Playgroud)

现在回想起来,我会说这是一个引人注目的坏主意-与大多数设计的其余部分一起java.util.Calendarjava.util.Date.

所以这个电话:

cal.set(Calendar.YEAR, 2001)
Run Code Online (Sandbox Code Playgroud)

不会更改...的值,Calendar.YEAR它会更改Calendar对象中的其他(私有)字段.

  • @tomasb:正如Marko所说,让它变得可变是一个糟糕的主意.但是整个"领域和一种方法而不是许多方法"随着时间的推移已经引起了很多问题.基本上java.util.*time API是一个灾难区域. (2认同)