2013-03-04 10 views
7

O ile mi wiadomo, nic powrót konstruktor, nawet nieważne,jak wyjaśnić instrukcję return w konstruktorze?

a także

return ; 

wewnątrz jakiejkolwiek metody oznacza powrót nieważne.

więc w moim programie

public class returnTest { 

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

    } 

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

Wołam

return; 

który będzie powrotu nieważne, ale konstruktor nie ma powrócić niczego program kompiluje dobrze.

proszę wyjaśnić.

+6

Czy słyszałeś o konwencjach nazw java? –

+1

Program nie kompiluje się w ogóle: podaje błąd kompilacji dla nieosiągalnego wyciągu. – EJP

+1

@EJP: hej, który był niezamierzony, ostatnia linia, którą właśnie napisałem przez pomyłkę, nie miała tam być –

Odpowiedz

15

return w konstruktorze po prostu wyskakuje z konstruktora w określonym punkcie. Możesz go użyć, jeśli nie musisz w pełni inicjować klasy w pewnych okolicznościach.

np.

// 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

Metody zadeklarowane przy typie zwracania void oraz konstruktorach nic nie zwracają. Dlatego możesz w ogóle pominąć w nich instrukcję return. Powodem, dla którego void typ zwracany nie jest określona dla konstruktorów jest rozróżnienie konstruktor z metody o tej samej nazwie:

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

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

wypowiedzi po zamian oświadczenie będzie nieosiągalny. Jeśli instrukcja return jest ostatnią, nie ma sensu definiować w konstruktorze, ale kompilator nie narzeka. Kompiluje się dobrze.

Jeśli robisz jakiś inicjalizacji w konstruktora na podstawie jeżeli stan ex., Można zainicjować połączenie z bazą danych, jeśli jest ona dostępna i powrócić jeszcze chcesz odczytać dane z dysku lokalnego do czasowego cel, powód.

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

W przeciwnym razie Else nie zostanie wykonane –

2

return może być używany natychmiast opuścić konstruktora. Wydaje się, że jednym przypadkiem jest tworzenie pół inicjowanych obiektów.

Można się spierać, czy to dobry pomysł. Problem z IMHO polega na tym, że obiekty wynikowe są trudne do pracy, ponieważ nie mają żadnych niezmienników, na których można polegać.

We wszystkich przykładach, które widziałem do tej pory, które używały return w konstruktorze, kod był problematyczny. Często konstruktorzy byli zbyt wielcy i zawierały zbyt wiele logiki biznesowej, co utrudniało ich testowanie.

Kolejny wzorzec, który widziałem implementował logikę kontrolera w konstruktorze. Jeśli przekierowanie było konieczne, konstruktor zapisał przekierowanie i wywołał zwrot.Poza tym, że konstruktory te również były trudne do przetestowania, głównym problemem było to, że kiedykolwiek trzeba pracować z takim obiektem, trzeba pesymistycznie założyć, że nie jest on w pełni zainicjowany.

Lepiej utrzymywać całą logikę z konstruktorów i dążyć do w pełni zainicjalizowanych, małych obiektów. Wtedy rzadko (jeśli w ogóle) będziesz musiał wywołać return w konstruktorze.

1

W tym przypadku return działa podobnie do break. Kończy się inicjalizacja. Wyobraź sobie klasę, która ma int var. Przekazujesz int[] values i chcesz zainicjować var na dowolnym dodatnim int przechowywanym w values (lub w innym przypadku var = 0). Następnie możesz użyć return.

public class MyClass{ 

int var; 

public MyClass(int[] values){ 
    for(int i : values){ 
     if(i > 0){ 
      var = i; 
      return; 
     } 
    } 
} 
//other methods 
} 
Powiązane problemy