2013-03-04 12 views
7

は、私の知る限りでは、任意のメソッド内のコンストラクタの戻り何でも無効ではない、コンストラクタ内のreturn文を説明する方法は?

とも

return ; 

はvoidを返すことを意味しません。

ので、私のプログラム

public class returnTest { 

    public static void main(String[] args) { 
     returnTest obj = new returnTest(); 
     System.out.println("here1"); 

    } 

    public returnTest() 
    { 
     System.out.println("here2"); 
     return ; 
    } 
    } 

に私はVOID帰国されます

return; 

を呼び出していますが、コンストラクタが何を返すことを想定されていない、 プログラムがうまくコンパイルされます。

をご説明ください。

+6

Java名の表記について聞いたことがありますか? –

+1

プログラムはまったくコンパイルされません。到達不能な文に対してコンパイルエラーが発生します。 – EJP

+1

@EJP:ちょっと間違って書かれた最後の行、それはそこにあるのではなく、 –

答えて

15

returnコンストラクタ内の指定された点のコンストラクタからちょうど飛び出します。状況によってはクラスを完全に初期化する必要がない場合に使用することができます。

// A very contrived example... 
class Demo 
{ 
    protected int id = 0; 
    protected int count = 0; 
    public Demo(int id, int count) 
    { 
     this.id = id; 
     this.count = count; 
     if (this.count <= 0) { 
      return; 
     } 
     // count > 0, do something meaningful 
1

voidで宣言されたメソッドおよびコンストラクタは、何も返されません。このため、returnステートメントをまったく省略することができます。文が到達不能になり復帰後

public class A 
{ 
    public A() // This is constructor 
    { 
    } 

    public void A() // This is method 
    { 
    } 
} 
1

文:void戻り値の型は、コンストラクタに指定されていない理由は、同じ名前のメソッドからコンストラクタを区別することです。 return文が最後であれば、コンストラクタで定義するのは役に立たないが、コンパイラは文句を言わない。それはうまくコンパイルされます。

あなたはかの条件の元に基づいてコンストラクタでいくつかの初期化を行っている場合。それが利用可能であり、それ以外を返すあなたは一時的にローカルディスクからデータを読みたい場合は、データベース接続を初期化することもできます目的。

public class CheckDataAvailability 
{ 
    Connection con =SomeDeligatorClass.getConnection(); 

    public CheckDataAvailability() //this is constructor 
    { 
     if(conn!=null) 
     { 
      //do some database connection stuff and retrieve values; 
      return; // after this following code will not be executed. 
     } 

     FileReader fr; // code further from here will not be executed if above 'if' condition is true, because there is return statement at the end of above 'if' block. 

    } 
} 
+2

それ以外の場合は、その時点では実行されません –

2

returnはすぐにコンストラクタを残すために使用することができます。 1つのユースケースは、半初期化されたオブジェクトを作成するように思われます。

これは良い考えであると主張することができます。 IMHOの問題は、結果として得られるオブジェクトが信頼できる不変量を持たないため、操作が難しいことです。

これまでコンストラクタでreturnを使用していたすべての例では、コードに問題がありました。多くの場合、コンストラクタは大きすぎてビジネスロジックが多すぎるため、テストするのが難しくなりました。

コンストラクタでコントローラロジックを実装したのがわかっている別のパターンです。リダイレクトが必要な場合、コンストラクターはリダイレクトを保存して戻り値を返します。さらに、これらのコンストラクタもテストするのが難しいという主な問題は、そのようなオブジェクトを扱うときはいつでも、完全に初期化されていないと悲観的に仮定しなければならないということでした。

すべてのロジックをコンストラクタから保護し、完全に初期化された小さなオブジェクトを目指してください。その後、コンストラクタでreturnに電話する必要はほとんどありません。

1

この場合、returnは、breakと同様に動作します。初期化が終了します。 int varを持つクラスを想像してください。 int[] valuesを渡し、varを(values)(またはそれ以外の場合はvar = 0)に格納された任意の正の値に初期化したいとします。その後、returnを使用できます。

public class MyClass{ 

int var; 

public MyClass(int[] values){ 
    for(int i : values){ 
     if(i > 0){ 
      var = i; 
      return; 
     } 
    } 
} 
//other methods 
} 
関連する問題