【问题标题】:Assigning Final variables from constructors | not allowed from methods. Why?从构造函数分配最终变量 |不允许来自方法。为什么?
【发布时间】:2016-06-08 03:08:55
【问题描述】:

练习一些代码示例,我遇到了这个: 我已经在类级别声明了最终变量并尝试从方法中分配值,导致编译时错误(代码 2)。但是从构造函数它确实被分配了(code-1)。

代码 1:

class Immutable {

    private final int age;
    private final String name;

    private Immutable(int age, String name) {
        this.age = age;
        this.name = name;
    }

代码 2:

class Immutable {

    private final int age;
    private final String name;

    private void me() {
        this.age = 19;
        this.name = "name";
    }

当然,它们也可以在类级别分配,但不允许再次在构造函数中执行,因为它们只允许声明一次。但是,为什么最终变量是在构造函数中分配而不是从方法中分配的?

【问题讨论】:

    标签: java methods constructor final


    【解决方案1】:

    构造函数执行一次。方法可以执行多次。对最终变量的赋值只允许一次——就这么简单。 (如果可以在构造后为它们分配不同的值,那么它们就不是很“最终”了?C# 允许多次设置只读变量,但仍然只能在构造函数中设置……Java 比这更严格一些.)

    【讨论】:

      【解决方案2】:

      正式地,此行为在Java Language specification 中定义:

      8.3.1.2。最终字段

      必须在声明它的类的每个构造函数(第 8.8 节)的末尾明确分配一个空白的最终实例变量(第 16.9 节);否则会发生编译时错误。

      原因是编译器在以任何其他方法完成另一个赋值时,要检测变量是否已经被更早地赋值,否则将是巨大的努力(如果不是不可能的话)。构造函数只执行一次,而任何其他方法都可以执行多次 - 因此检查一个字段是否在构造函数中被初始化对于编译器来说要容易得多。

      【讨论】:

        【解决方案3】:

        但是,为什么最终变量是在构造函数中分配而不是从方法中分配的?

        因为作为一个方法,即使将方法设置为private,也总会有再次调用该方法的趋势。 publicprotected 的其他方法可能仍然能够调用它,并且调用它的那些非私有方法可以在类外调用。

        所以唯一允许赋值一次的地方是在构造函数中(它只会在对象被实例化时被调用)。

        【讨论】:

          猜你喜欢
          • 2016-12-17
          • 1970-01-01
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 2015-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多