在Java中构造函数之前初始化final变量

有没有在Java构造函数中使用final变量的解决方案? 问题是,如果我初始化最终字段,如:

private final String name = "a name"; 

那么我不能在构造函数中使用它。 Java首先运行构造函数,然后运行字段。 有没有一个解决方案允许我访问构造函数中的最后一个字段?

我真的不明白你的问题。 那

 public class Test3 { private final String test = "test123"; public Test3() { System.out.println("Test = "+test); } public static void main(String[] args) { Test3 t = new Test3(); } } 

执行如下:

 $ javac Test3.java && java Test3 Test = test123 

在构造函数中进行初始化,例如,

 private final String name; private YourObj() { name = "a name"; } 

当然,如果你真的知道变量声明时间的值,那么使它成为常量更有意义,例如,

 private static final String NAME = "a name"; 

我们正在摆脱这个问题。

是的,您可以使用private final变量。 例如:

 public class Account { private final String accountNumber; private final String routingNumber; public Account(String accountNumber, String routingNumber) { this.accountNumber = accountNumber; this.routingNumber = routingNumber; } } 

这意味着Account类依赖于两个字符串,帐户和路由号码。 构造Account类时,必须设置这些类属性的值,并且如果不创建新类,则无法更改这些数字。

这里的’final’修饰符使属性不可变。

将其标记为静态,将允许您在构造函数中使用它,但由于您将其设置为final,因此无法更改。

 private static final String name = "a_name"; 

也可以使用静态init块。

 private static final String name; static { name = "a_name"; } 

如果您尝试修改构造函数中的值,则无法指定默认值,或者必须使其不是最终值。

 private String name = "a_name"; Foo( String name ) { this.name = name; } 

要么

 private final String name; Foo( String name ) { if( s == null ) this.name = "a_name"; else this.name = name; } 

在这种情况下,您也可以将该字段标记为“静态”。

另一种可能性是在实例初始化器blocK中初始化字段:

 public class Foo { final String bar; { System.out.println("initializing bar"); bar = "created at " + System.currentTimeMillis(); } public Foo() { System.out.println("in constructor. bar=" + bar); } public static void main(String[] args) { new Foo(); } } 

在这种情况下,您也可以将其设为静态。 Java约定是在ALL_CAPS中命名这样的常量。

 private static final String name = getName(); 

其中getName()是一个静态函数,可以获取名称。

我不能在构造函数中使用它,而java首先运行构造函数然后运行字段…

这是不正确的,首先计算字段,否则您无法访问构造函数中任何成员的默认值,因为它们不会被初始化。 这确实有效:

 public class A { protected int member = 1; public A() { System.out.println(member); } } 

关键字final仅标记成员常量,否则将被视为任何其他成员。

编辑:您是否尝试在构造函数中设置值? 这是行不通的,因为如果定义为final,则成员是不可变的。