1. 引言
开发人员在编程时会面临一个选择:是使用setter方法还是构造函数来设置变量的值。这两种方法各有优势,但它们适用于不同的场景。
在这篇教程中,我们将讨论在Java中何时使用setter方法或构造函数来设置变量的值。
2. 使用setter方法
setter方法是我们可以用来在Java类中设置实例变量的函数。它们提供了一种灵活的方式来修改对象初始化后状态的方式。使用setter方法设置的实例变量不能声明为final,因为可以在对象初始化后更改其值。
让我们考虑一个Web应用中用户类的现实世界例子:
public class User {
private String username;
private String password;
public void setUsername(String username) {
// Validate username format
if (username.matches("[a-zA-Z0-9_]+")) {
this.username = username;
} else {
throw new IllegalArgumentException("Invalid username format");
}
}
// Other methods...
}
在这个例子中,User
类封装了Web应用的用户数据。setUsername()
和setPassword()
方法分别用于设置username
和password
。这些方法还会进行验证,确保用户名符合特定格式且密码满足某些强度要求。
让我们测试setter方法,为User
对象设置username
:
@Test
void givenNewUser_whenSettingUsername_thenUsernameIsSet() {
User user = new User();
user.setUsername("john_doe");
assertEquals("john_doe", user.getUsername());
}
这里,我们使用默认构造函数User()
创建一个新的User
对象,然后调用setUsername()
方法在用户对象上设置username
为"john_doe"。最后,我们使用断言来验证username
已正确设置。
3. 使用构造函数
构造函数是特殊的方法,用于初始化对象。当创建一个类的对象时,它们会被调用。构造函数也可以用于设置实例变量的初始值。构造函数的一个显著特点是它们允许初始化final实例变量,确保这些值在整个对象生命周期中保持不变。
让我们看一个代表电子商务系统中产品的Product
类的实际例子:
public class Product {
private String name;
private double price;
private String category;
public Product(String name, double price, String category) {
this.name = name;
this.price = price;
this.category = category;
}
// Other methods...
}
在这个例子中,Product
类表示电子商务系统中可供销售的产品。Product(String name, double price, String category)
构造函数初始化产品的name
、price
和category
。通过使用构造函数,我们可以确保产品的重要信息,如名称、价格和类别,在对象创建时就已设定。
要使用构造函数创建具有特定细节的Product
对象:
@Test
void givenProductDetails_whenCreatingProductWithConstructor_thenProductHasCorrectAttributes() {
Product product = new Product("Smartphone", 599.99, "Electronics");
assertEquals("Smartphone", product.getName());
assertEquals(599.99, product.getPrice(), 0.001);
assertEquals("Electronics", product.getCategory());
}
这里,我们使用构造函数Product(String name, double price, String category)
直接在创建对象时传递产品的名称、价格和类别作为参数。
4. 选择setter方法与构造函数
在setter方法和构造函数之间做出选择时,请考虑以下指导原则:
使用setter方法
使用构造函数
当变量的值可能会随时间变化
当初始化不可变属性
当在设置值之前需要验证或附加逻辑
当确保某些值在对象创建时设置
当在对象初始化后设置值
当变量的值在初始化后不应更改
5. 总结
总之,setter方法和构造函数都是Java中设置变量值的关键工具。通过理解本文介绍的区别和指导原则,开发者能够明智地决定何时有效地使用setter方法或构造函数。
如往常一样,相关的源代码可以在GitHub上找到。