8

Javaコンストラクタで最終変数を使用する解決策はありますか? 問題は、最終フィールドを次のように初期化した場合です。

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 クラスが 2 つの文字列 (口座番号とルーティング番号) に依存していることです。これらのクラス属性の値は、Account クラスの構築時に設定する必要があり、新しいクラスを作成せずにこれらの数を変更することはできません。

ここでの「final」修飾子は、属性を不変にします。

于 2011-09-09T13:59:53.077 に答える
3

静的とマークすると、コンストラクターで使用できるようになりますが、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;
}
于 2009-03-24T14:21:56.283 に答える
2

この場合、フィールドを「静的」としてマークすることもできます。

于 2009-03-24T14:18:33.860 に答える
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は単にメンバー定数をマークするだけで、それ以外の場合は他のメンバーとして扱われます。

編集:コンストラクターで値を設定しようとしていますか? final として定義されている場合、メンバーは不変であるため、これは機能しません。

于 2009-03-24T14:51:40.830 に答える