从参数化构造函数调用“this”——更好的Java方法 考虑一个班的学生。以下是在默认构造函数中初始化实例值的两种方法: class Student { int units; Student() { this(10); } Student(int x) { units = x; } };

从参数化构造函数调用“this”——更好的Java方法 考虑一个班的学生。以下是在默认构造函数中初始化实例值的两种方法: class Student { int units; Student() { this(10); } Student(int x) { units = x; } };,java,Java,上述方法优于以下方法: class Student { int units; Student() { units = 10; } Student(int x) { units = x; } }; 哪种方法更好更可取 这是有争议的,取决于风格 就我个人而言,我会选择第一种方法,这样就只有一个主构造函数,所有数据都将通过该构造函数到达最后。在另一个二级构造函数中,您可以自己设置一些未注入的值,但所有数据最

上述方法优于以下方法:

 class Student {
     int units;

     Student() {
         units = 10;
     }

     Student(int x) {
         units = x;
     }
 };

哪种方法更好更可取

这是有争议的,取决于风格


就我个人而言,我会选择第一种方法,这样就只有一个主构造函数,所有数据都将通过该构造函数到达最后。在另一个二级构造函数中,您可以自己设置一些未注入的值,但所有数据最终都是通过同一个构造函数注入的。

在这个简单的例子中,我们看不到一个或另一个解决方案的真正优势

但作为一般规则,我更喜欢构造函数调用另一个构造函数的解决方案,因为这样可以避免重复自己。 假设在构造函数中添加两个或三个参数,并执行一些处理。您可能应该在没有参数的构造函数中复制它

例如,对于构造函数中的复制:

class Student {
  int units;
  int otherUnits;
  boolean isTrue;

  Student() {
     this.units = 10;
     this.otherUnits = 20;
     this.isTrue = true; 
     computeIntermediaryValue(units,otherUnits,isTrue);
  }

  Student(int units, int otherUnits, boolean isTrue) {
     this.units = units;
     this.otherUnits = otherUnits;
     this.isTrue = isTrue;              
     computeIntermediaryValue(units,otherUnits,isTrue);         
  }
}
应避免不必要的重复

在构造函数中没有重复,看起来更好:

class Student {
  int units;
  int otherUnits;
  boolean isTrue;

  Student() {
     this(10, 20, true);
  }

  Student(int units, int otherUnits, boolean isTrue) {
     this.units = units;
     this.otherUnits = otherUnits;
     this.isTrue = isTrue;              
     computeIntermediaryValue(units,otherUnits,isTrue);         
  }
}
内存问题:从另一个构造函数调用一个会占用内存。因为它需要使用堆栈内存。为了提高内存效率,您应该使用第二种方法

速度问题:在第二种方法中,编译器首先必须检查将调用哪个构造函数,并在确定它将调用所需的构造函数之后进行检查。但在某些情况下,编译器占用的时间会消耗您,而在第一种方法中,总是调用默认构造函数

用户问题:最重要的是编写代码的方式以及使用不同参数调用参数化构造函数的需要。在用户需要在构造函数调用中放入定制数据的情况下,第二种方法似乎很好

虽然并没有提到这方面的标准实践,但我喜欢使用第一种方法


*@davidxxx

中提到的复制问题如果您询问是否有此方面的标准做法,则没有。应避免不需要的复制的可能复制。有趣的句子,特别是因为这个问题有重复。好词:不幸的是,在你提到的:stackoverflow.com/questions/581873/…评价最高的答案没有任何解释,我在任何回复中也没有找到任何代码重复的参考。此外,在老问题中,OP不知道如何处理。这里的情况并非如此@Tom