8

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

private final String name = "a name";

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

4

9 回答 9

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
于 2009-03-24T14:20:14.620 回答
15

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

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

当然,如果您确实知道变量声明时的值,则将其设为常量更有意义,例如,

private static final String NAME = "a name";
于 2009-03-24T14:18:07.183 回答
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”修饰符使属性不可变。

于 2011-09-09T13:59:53.077 回答
3

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

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;
}
于 2009-03-24T14:21:56.283 回答
2

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

于 2009-03-24T14:18:33.860 回答
2

另一种可能性是在实例初始化程序块中初始化字段:

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();
        }
}
于 2009-03-24T14:55:02.647 回答
1

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

于 2009-03-24T14:18:52.313 回答
1
private static final String name = getName();

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

于 2009-03-24T14:21:06.973 回答
0

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

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

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

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

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

于 2009-03-24T14:51:40.830 回答