我们可以在 Java 中使用方法来初始化对象或实例变量吗?

Can we use methods to initialize object or instance variable in Java?

提问人:Ajay Rawat 提问时间:3/23/2023 更新时间:3/23/2023 访问量:233

问:

伙计们,我最近在学习 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();
    }
}
Java Object OOP 方法 构造函数

评论

0赞 Anand Dwivedi 3/23/2023
在创建类对象时初始化某些内容是使用构造函数初始化,而方法调用是在创建类对象之后,并且应该包含业务逻辑
0赞 experiment unit 1998X 3/23/2023
当少行就足够时,为什么要输入更多的代码行?
0赞 experiment unit 1998X 3/23/2023
你也可以看看这个 SO 帖子 stackoverflow.com/a/19359582/16034206
0赞 Ajay Rawat 3/23/2023
好的,但我也可以使用方法初始化我的类变量,而不是创建构造函数,好吧,我明白了,谢谢大家的回复
1赞 Thomas Kläger 3/23/2023
正如你所发现的,你可以使用方法和构造函数。但是:类的用户可能会忘记调用初始化方法。但是,他们永远不会忘记调用构造函数,因为构造函数调用是在您编写 ( or ) 时隐式完成的。new Student()new Student(111, "Karan")

答:

0赞 Adrian Ng 3/23/2023 #1

这作为您的参考:

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注解即可。

虽然确实可以使用方法初始化实例变量,但构造函数是一种更自然、更方便的方式,并且具有其他优点,例如自动调用、清晰的语法以及强制实施初始化约束的能力。

0赞 Joachim Sauer 3/23/2023 #2

可以使用构造函数实现但不能使用“常规方法”实现的一个重要功能是提供不变量:

如果一个类可以保证其所有实例的某些属性(有时这些属性称为“不变量”),这将非常有用。

例如,你可以有一个类来保证并且将始终具有有效的、非空的、非空的值(顺便说一句,这在现实世界中绝对不是真的,但让我们假装这个世界很简单)。PersongivenNamelastName

您可以使用一个构造函数来执行此操作,该构造函数采用参数并验证它们是否有效:

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 。Personperson.hasValidNames()PersongivenNamenull

如果改为在普通方法中初始化字段,则默认构造函数会将字段设置为 。这并不是世界末日本身,但这意味着从其他任何地方传递的代码都需要考虑这些字段中的任何一个都可以是 的选项,这可能会增加很多复杂性。nullnull