как объяснить оператор 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