web-dev-qa-db-ja.com

Java 8:空白の戻り値はコンストラクタで何をしますか?

このプログラムは正常に実行されます。暗黙的にこれを返すことがわかっているので、コンストラクタでの空白の戻りの使用とは何ですか。 Java=のバグですか、それとも何らかの用途がありますか?.

class Demo
{
    int salary;

    Demo()
    {
        salary =11500;
        //return this;(implicitly)
        return;
    }
    public static void main(String... s)
    {
        System.out.println(new Demo().salary);
    }
}   
1
HitRo

Void関数の戻り値は、関数の自然な終わりの前に制御フローをエスケープするために使用されます。そのため、有効なステートメントである必要があります。

関数の最後のステートメントが既存のコードを壊す以外に役立たないので、それを明示的に禁止するために邪魔になることはありません。

あなたはそれを糸くずしたいかもしれませんが、それをエラーにしたり、不正な形式にすることはできません。

5
Lars Viklund

コンストラクタの最後に単一のリターンを置いても何も変わりませんが、害はなく、voidメソッドの最後にリターンを置くことと同じです。ただし、 ガード条件 のように、コンストラクタの別の場所にリターンを配置すると、違いが生じます。これは許容されるので、戻りの使用を冗長でない状況のみに制限することの価値は、実際に努力する価値はありません。それは理由もなく言語を複雑にします。

2
JimmyJames

呼び出し元にとって、コンストラクターはインスタンスを返すstaticメソッドと同様に動作します。しかし、内部からコンストラクターはvoidinstanceメソッドを返すように動作するため、returnステートメントで値を指定できないのは一貫性があるだけです。

これをnew XYZ()として精神的にモデル化し、通常のインスタンスメソッドと同様に、最初にコンパイラ生成コードでゼロに初期化されたインスタンスを作成してから、そのインスタンスでユーザー作成コンストラクタを呼び出すことができます。

何かのようなもの:

public static T create() // Compiler generated
{
    T instance = AllocateZeroed<T>();

    instance.field1 = ABC; // field initializers
    instance.field2 = DEF; // field initializers        
    ...

    instance.constructor(); // user-written constructor chain

    return instance;
}
0
CodesInChaos