是否有在Java构造函数中使用final变量的解决方案? 问题是,如果我初始化最终字段,如:
private final String name = "a name";
然后我不能在构造函数中使用它。 Java首先运行构造函数然后运行字段。有没有一个解决方案允许我访问构造函数中的最后一个字段?
答案 0 :(得分:17)
我真的不明白你的问题。这
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
答案 1 :(得分:15)
在构造函数中进行初始化,例如,
private final String name;
private YourObj() {
name = "a name";
}
当然,如果您确实知道变量声明时间的值,那么使它成为常量更有意义,例如,
private static final String NAME = "a name";
答案 2 :(得分:5)
我们正在摆脱这个问题。
是的,您可以使用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'修饰符使属性不可变。
答案 3 :(得分:3)
将其标记为静态,将允许您在构造函数中使用它,但由于您将其设置为final,因此无法更改。
private static final String name = "a_name";
也可以使用静态初始化块。
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;
}
答案 4 :(得分:2)
在这种情况下,您也可以将该字段标记为“静态”。
答案 5 :(得分:2)
另一种可能性是在实例初始化程序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();
}
}
答案 6 :(得分:1)
在这种情况下,您也可以将其设为静态。 Java约定是在ALL_CAPS中命名这样的常量。
答案 7 :(得分:1)
private static final String name = getName();
其中 getName()是一个静态函数,可以为您命名。
答案 8 :(得分:0)
我不能在构造函数中使用它,而java首先运行构造函数然后运行字段...
这是不正确的,首先评估字段,否则您无法访问构造函数中任何成员的默认值,因为它们不会被初始化。 工作:
public class A {
protected int member = 1;
public A() {
System.out.println(member);
}
}
关键字 final 仅标记成员常量,否则将被视为任何其他成员。
编辑:你是否试图在构造函数中设置值?这是行不通的,因为如果定义为final,则成员是不可变的。