как объяснить оператор return в конструкторе?

насколько я знаю , конструктор ничего не возвращает, даже void,

и

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 ;
    }
    }

Я призываю

return;

который будет возвращать VOID, но конструктор не должен ничего возвращать , программа компилируется просто замечательно .

пожалуйста, объясните .

6 ответов


return в конструкторе просто выскакивает из конструктора в указанной точке. Вы можете использовать его, если вам не нужно, чтобы полностью инициализировать класс В некоторых обстоятельствах.

например

// A real life example
class MyDate
{
    // Create a date structure from a day of the year (1..366)
    MyDate(int dayOfTheYear, int year)
    {
        if (dayOfTheYear < 1 || dayOfTheYear > 366)
        {
            mDateValid = false;
            return;
        }
        if (dayOfTheYear == 366 && !isLeapYear(year))
        {
            mDateValid = false;
            return;
        }
        // Continue converting dayOfTheYear to a dd/mm.
        // ...

return можно использовать, чтобы немедленно покинуть конструктор. Одно дело использовать, кажется, чтобы создать половину-инициализированных объектов.

можно поспорить, является ли это хорошей идеей. Проблема IMHO заключается в том, что с результирующими объектами трудно работать, поскольку у них нет инвариантов, на которые можно положиться.

во всех примерах, которые я видел до сих пор, которые использовали return в конструкторе код был проблематичным. Часто конструкторы были слишком большими и слишком замкнутыми. много бизнес-логики, что затрудняет ее проверку.

другой шаблон, который я видел, реализовал логику контроллера в конструкторе. Если перенаправление было необходимо, конструктор сохранял перенаправление и вызывал returned. Помимо того, что эти конструкторы также было трудно проверить, основная проблема заключалась в том, что всякий раз, когда нужно работать с таким объектом, вы должны пессимистически предположить, что он не полностью инициализирован.

лучше держать всю логику из конструкторы и цель для полностью инициализированных, небольших объектов. Тогда вам редко (если когда-либо) нужно будет звонить return в конструктор.


заявления после возвращение заявление будет недоступен. Если оператор return является последним, то он бесполезен для определения в конструкторе, но все же компилятор не жалуется. Он прекрасно компилируется.

Если вы делаете некоторую инициализацию в конструкторе на основе если условие ex., вы можете инициализировать подключение к базе данных, если оно доступно, и возвращать данные из локальный диск для временного использования.

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.

    }
}

методы, объявленные с void возвращаемый тип, а также конструкторы просто ничего не возвращают. Вот почему вы можете опустить return заявление в них вообще. Причина, почему void тип возвращаемого значения не определен для конструкторов, чтобы отличить конструктор от метода с тем же именем:

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

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

в этом случае return действует аналогично break. Он завершает инициализацию. Представьте себе класс, который имеет int var. Вы проходите int[] values и хотите инициализировать var к какому-либо положительному int хранящиеся в 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
}

public class Demo{

 Demo(){
System.out.println("hello");
return;
 }

}
class Student{

public static void main(String args[]){

Demo d=new Demo();

}
}
//output will be -----------"hello"


public class Demo{

 Demo(){
return;
System.out.println("hello");

 }

}
class Student{

public static void main(String args[]){

Demo d=new Demo();

}
}
//it will throw Error