Java 构造器方法和set方法设置参数的经验

本文探讨了如何通过定义有参构造方法确保对象在实例化时必须提供必要参数,以此强制属性的非空性。同时,讨论了在某些场景下,允许对象有无参构造方法并提供默认属性值的重要性。此外,还强调了set方法的使用条件,如不可变属性不应有set方法,并推荐使用有参构造方法初始化。最后,提到了属性与方法参数的区别,以及属性与对象的关系在设计时的考虑。
  • 如果定义了有参构造方法,而没有额外定义无参构造方法,那么对象无法在无参情况下实例化,我们可以这样利用性质:这些参数是一个对象调用方法时必须的
  • 比如对象是一个人,它有属性手,和方法拿东西,因为拿东西必须要有手这个属性,这个属性不能为空,所以设置有参构造方法,而不复写无参构造方法,目的就是要求对象必须实现某些参数
  • 我们换一种思路,我们可以让这样需求的对象有无参构造方法,但是必须重写无参构造方法,该方法必须定义必须参数的默认实现,或者,为了代码简洁和可用性强,我们可以利用重载的特性,实现一些常用的默认属性,所谓约定大于配置
  • 而set方法,对于属性来说,如果一个属性是可修改的,那么他的set方法是有意义的,否则,比如说人的性别这个属性,这个是不能修改的,所以不能有set方法,而且最好设置一个有参构造方法,初始化人的性别
  • 此外如果我们有一个方法,要求在掉用的时候,必须要有某属性,那么我们可以把属性传递进去,这就是调用外部的属性,一般属性这里要用到多态,至于是接口还是抽象类,父类,主要是接口只有方法,而父类或抽象类有属性
  • 同时我们还需要注意一点,那就是属性和对象的关系,比如说手肯定是作为人的属性,不能作为方法的参数传入,而扳手肯定不能作为属性,而是作为方法的参数传入
### Java 构造器与 getter/setter 方法的区别 在 Java 面向对象编程中,构造器 getter/setter 方法分别承担着不同的职责,它们在类的设计对象的生命周期中扮演着不同的角色。 #### 构造器的作用 构造器是一种特殊的方法,用于在创建对象时初始化对象的状态。构造器的名称必须与类名相同,并且没有返回类型。构造器在使用 `new` 关键字创建对象时自动调用。构造器可以包含参数,以便在创建对象时直接为对象的属性赋值。例如,在 `Order` 类中通过有参构造方法创建对象时,可以直接为订单设置支付金额: ```java Order o2 = new Order(157.689); ``` 构造器的一个重要特点是,它确保了对象在创建时就处于一个合法的状态,避免了对象属性未被初始化的情况[^3]。 #### getter/setter 方法的作用 getter setter 方法是用于访问修改类的私有属性方法。通过将属性设置为私有(`private`),并提供公开的 getter setter 方法,可以实现对数据的封装,从而保护数据的安全性。例如,在 `StudentTest.java` 中,`age` 属性被声明为私有,而通过 `setAge` 方法可以对传入的年龄值进行逻辑校验: ```java public void setAge(int a) { if (a > 0 && a < 120) { age = a; } else { age = 18; System.out.println("年龄无效,默认年龄 18"); } } ``` 通过这种方式,setter 方法不仅可以设置属性值,还可以添加额外的验证逻辑,确保数据的有效性。getter 方法则用于获取属性值,提供对私有属性的受控访问[^1]。 #### 两者的区别 1. **用途不同**: - 构造器用于初始化对象的状态,确保对象在创建时就具有合理的初始值。 - getter setter 方法用于在对象创建后,访问修改对象的属性值。 2. **调用时机不同**: - 构造器在对象创建时自动调用。 - getter setter 方法可以在对象的生命周期中随时调用。 3. **参数传递方式不同**: - 构造器通常在创建对象时传递参数,用于初始化对象的属性。 - getter 方法通常没有参数,只返回属性值;setter 方法通常有一个参数,用于设置属性值。 4. **数据校验能力**: - 构造器虽然可以在初始化时进行数据校验,但通常不如 setter 方法灵活。 - setter 方法可以在设置属性值时进行复杂的逻辑判断,确保数据的有效性。 5. **自动生成工具支持**: - 使用 Lombok 库可以自动生成 getter、setter 方法以及构造器,简化代码编写。例如,通过注解 `@Data` 可以自动生成 getter、setter、`toString` 等方法;通过 `@NoArgsConstructor` `@AllArgsConstructor` 可以自动生成无参有参构造器[^4]。 #### 示例代码 以下是一个简单的 `Point` 类示例,展示了构造器 getter/setter 方法的使用: ```java public class Point { private int x; private int y; // 无参构造器 public Point() { } // 有参构造器 public Point(int x, int y) { this.x = x; this.y = y; } // getter 方法 public int getX() { return x; } public int getY() { return y; } // setter 方法 public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } @Override public String toString() { return "Point(" + x + ", " + y + ")"; } } ``` 在测试类中,可以通过构造器创建对象并使用 getter setter 方法进行测试: ```java public class Test { public static void main(String[] args) { Point po1 = new Point(20, 21); Point po2 = new Point(22, 22); System.out.println(po1); System.out.println(po2); } } ``` #### 总结 构造器 getter/setter 方法Java 中各有其独特的用途。构造器主要用于对象的初始化,而 getter setter 方法则用于对象属性的访问修改。通过合理使用构造器 getter/setter 方法,可以更好地实现面向对象编程中的封装特性,提高代码的安全性可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值