提问人:Ajay Rawat 提问时间:3/23/2023 更新时间:3/23/2023 访问量:233
我们可以在 Java 中使用方法来初始化对象或实例变量吗?
Can we use methods to initialize object or instance variable in Java?
问:
伙计们,我最近在学习 Java,我刚刚完成了构造函数的概念。所以我的理解是构造函数用于初始化实例变量或对象,但我们可以使用方法来完成初始化实例变量的相同任务,任何人都可以帮助我了解我们到底使用什么构造函数
//This is my code I tried to initialize instance variable using methods instead of constructors
class Student {
int rollno;
String name;
void insertRecord(int r, String n) {
rollno = r;
name = n;
}
void displayInformation() {
System.out.println(rollno + " " + name);
}
}
public class TestStudent4 {
public static void main(String args[]) {
Student s1 = new Student();
Student s2 = new Student();
s1.insertRecord(111, "Karan");
s2.insertRecord(222, "Aryan");
s1.displayInformation();
s2.displayInformation();
}
}
答:
这作为您的参考:
public class Student {
private int rollNumber;
private String name;
public Student(int rollNumber, String name) {
this.rollNumber = rollNumber;
this.name = name;
}
public int getRollNumber() {
return rollNumber;
}
public void setRollNumber(int rollNumber) {
this.rollNumber = rollNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void displayInformation() {
System.out.println(rollNumber + " " + name);
}
}
public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student(111, "Karan");
Student s2 = new Student(222, "Aryan");
s1.displayInformation();
s2.displayInformation();
}
}
- 或者,如果使用 Lombok,则不必使用 getter 或 setter,只需在 Spring 中使用@Data注解即可。
虽然确实可以使用方法初始化实例变量,但构造函数是一种更自然、更方便的方式,并且具有其他优点,例如自动调用、清晰的语法以及强制实施初始化约束的能力。
可以使用构造函数实现但不能使用“常规方法”实现的一个重要功能是提供不变量:
如果一个类可以保证其所有实例的某些属性(有时这些属性称为“不变量”),这将非常有用。
例如,你可以有一个类来保证并且将始终具有有效的、非空的、非空的值(顺便说一句,这在现实世界中绝对不是真的,但让我们假装这个世界很简单)。Person
givenName
lastName
您可以使用一个构造函数来执行此操作,该构造函数采用参数并验证它们是否有效:
public class Person {
private final String givenName;
private final String lastName;
public Person(String givenName, String lastName) {
this.givenName = verifyValidName(givenName);
this.lastName = verifyValidName(lastName);
}
private static String verifyValidName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("name is null or empty");
}
return name;
}
// getters
}
请注意,在实际的当前代码库中,这几乎可以肯定应该是一个记录而不是常规类,但这不会从根本上影响答案,新开发人员可能还不知道
记录
类。
使用此代码时,任何使用对象的代码(无论它是自己创建的还是从其他地方传递的)都知道这两个字段将是非 null。没有必要在整个代码中都进行调用,因为您知道 no 可以存在于 where is 。Person
person.hasValidNames()
Person
givenName
null
如果改为在普通方法中初始化字段,则默认构造函数会将字段设置为 。这并不是世界末日本身,但这意味着从其他任何地方传递的代码都需要考虑这些字段中的任何一个都可以是 的选项,这可能会增加很多复杂性。null
null
评论
new Student()
new Student(111, "Karan")