【问题标题】:Separately declare and assign to a final variable - Java分别声明并分配给最终变量 - Java
【发布时间】:2012-09-11 15:57:37
【问题描述】:

我有一个类,里面有一些小类,它们充当常量的“存储单元”。问题是,我需要一些信息来为这些常量赋值,而我只能在构造函数中获取这些信息。不幸的是,miniclass 没有在构造函数中声明,NetBeans 告诉我不能分配给 final 变量,即使它只是被声明,而不是初始化。我该怎么办?

编辑:会出现此问题的一些代码示例:

public class Car {
    class constants {
        public final String MAKE;
        public final String REGISTRATION_NUMBER;
    }
    public Car(String make, String regNumber) {
        constants.MAKE = make;
        constants.REGISTRATION_NUMBER = regNumber;
    }
}

【问题讨论】:

  • 我猜你的“迷你类”也需要构造函数。然后外部类构造函数可以传递参数。
  • 规则是所有非静态 final 字段必须在包含它们的类的构造函数完成时分配(即在它们的声明中,在实例初始化程序块中,或者在每个构造函数的代码中)。
  • 这个例子对我来说没有多大意义 - MAKE 是一个实例变量,你试图在赋值语句中将它称为静态变量。

标签: java variables constants


【解决方案1】:

您正在尝试做的事情无法工作,因为您在某处需要 Constants 类的实例。一种方法是按以下方式进行,但是该常数没有任何常数...

public class Car {
    class Constants {
        public final String MAKE;
        public final String REGISTRATION_NUMBER;
        private Constants(String make, String regNumber) {
            this.MAKE = make;
            this.REGISTRATION_NUMBER = regNumber;
        }
    }

    public final Constants constants;
    public Car(String make, String regNumber) {
        this.constants = new Constants(make, regNumber);
    }
}

然后您可以调用:

Car car = new Car("abc", "def");
String make = car.constants.MAKE;

注意:一个可能更好(和更简单)的设计是

public class Car {
    private final String make;
    private final String regNumber;

    public Car(String make, String regNumber) {
        this.make = make;
        this.regNumber = regNumber;
    }

    //getters
}

【讨论】:

  • 第二个例子更简单,并且更容易被查看代码的其他人理解,因为它遵循公认的 Java 实践。创建一个内部类来保存这些字段是多余的。
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2018-11-28
  • 2014-06-04
  • 2015-12-23
相关资源
最近更新 更多