Java class 构造函数 this.id = id 或 this.setId(id)

Java class constructor this.id = id or this.setId(id)

在 Android Studio 中,我创建了一个 Person.java class。我使用 Generate 创建了 getter 和 setter 以及一个构造函数。

这是我的 Person.java class:

public class Person {
private int id;
private String firstName;
private String lastName;
private String email;

    public User(int id, String firstName, String lastName, String email) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public void setId(int Id) {
        this.Id = Id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Can/should 我将构造函数更改为:

public Person(int Id, String firstName, String lastName, String email) {
    this.setId(Id);
    this.setFirstName(firstName);
    this.setLastName(lastName);
    this.setEmail(email);
}

自动生成的那个好还是我改成的那个好?它在运行时会有一些改进吗?

我对 PHP (7.4) classes.

有同样的问题

提前致谢!

Java 编译器通常会优化很多东西,所以最终代码可能无论如何都会转换为第二个示例,因为方法调用通常比直接设置值更糟糕。

在您的示例中,它确实没有什么区别,我只保留第一个,因为您可以在生成时保留它。即使第二个选项表现更好,好处也太小以至于无法被注意到。

真正在构造函数中调用 setters 的唯一原因是它们内部是否有逻辑,在您的情况下,您可以检查电子邮件是否是真实的电子邮件。那么最好在构造函数中调用 setEmail(email) ,因为该方法包含不应放在构造函数内部的逻辑(并且也不需要在构造函数和 setter 中进行检查代码重复)

在进行 Android 编程时,您也可以查看 Kotlin,它看起来像这样:

data class User(val id:Int, var firstName:String, var lastName:String, var email:String)

替换了您编写的整个 class,您不需要 setter,因为您可以在需要时选择定义它们。

Setter方法一般用在我们需要修改某个字段的值的时候。而我们根据对象创建时提供的参数在构造函数中初始化这些字段的值。所以我想当我们做 this.id = id

时更好的做法

这取决于您的设置器是否执行验证之类的操作。也许您想验证 id 是否为正或 email 地址是否有效。在这些情况下,您可以在两个地方放置验证逻辑,要么在构造函数中,要么在设置器中。如果 class 是不可变的,那么在构造函数中是有意义的,但如果不是,则在设置器中是有意义的,在这种情况下,从构造器中调用设置器是有意义的。