为何使用带参构造器而非普通方法初始化对象?
嗨,很高兴你能主动琢磨这个问题——这绝对是新手养成良好编码习惯的关键一步!我来给你拆解下带参构造器相比普通初始化方法的核心优势:
确保对象从诞生起就是“完整合法”的
想象一下,如果有人用你的WeightIn类时,创建了对象却忘了调用Setvalues方法,那这个对象里的weight和height就会是默认的0.0。要是后续有依赖这两个属性的计算逻辑(比如算BMI),肯定会出问题。而带参构造器强制要求创建对象时必须传入必要的属性值,从根源上避免了“半初始化”的无效对象。代码更简洁,意图更明确
用带参构造器的话,创建对象和初始化一步到位:WeightIn weight1 = new WeightIn(3.65, 1.7);,别人看代码一眼就知道这个对象的初始状态。而用默认构造器加Setvalues的方式,需要写两行代码,可读性和简洁性都差一截。支持不可变对象的设计
如果你想让对象创建后属性就不能被修改(这种不可变对象在多线程场景或者需要保证数据一致性的地方特别有用),用带参构造器初始化属性后,直接去掉所有set方法就行。但如果用Setvalues这种方法,属性始终是可修改的,没法实现不可变的设计。符合面向对象的设计理念
在Java的设计逻辑里,构造器的核心职责就是初始化对象,这是“封装”思想的体现——把对象的初始化逻辑统一放在构造器里,保证对象的完整性和一致性。很多Java核心类(比如String、Integer)都是这么做的,遵循这个规范能让你的代码更符合其他开发者的预期。
给你改个示例代码,你可以对比下:
public class WeightIn{ private double weight; private double height; // 带参构造器,强制初始化必要属性 public WeightIn(double weightIn, double heightIn){ this.weight = weightIn; this.height = heightIn; } // 如果确实需要修改属性,可以保留set方法;如果是不可变对象,直接删掉这些方法即可 public void setWeight(double weightIn){ this.weight = weightIn; } public void setHeight(double heightIn){ this.height = heightIn; } } public class WeightInApp{ public static void main (String [] args){ // 创建对象时直接完成初始化,一步到位 WeightIn weight1 = new WeightIn(3.65, 1.7); WeightIn weight2 = new WeightIn(1.7, 1.7); } }
当然啦,如果你的类确实允许对象先“空创建”再逐步设置属性,那用set方法也没问题,但对于那些属性是对象必备要素的场景,带参构造器绝对是更优的选择。
备注:内容来源于stack exchange,提问作者rado_rud

