Java 我可以在构造函数中调用set方法吗

Java 我可以在构造函数中调用set方法吗,java,constructor,encapsulation,Java,Constructor,Encapsulation,我设置了许多set方法,并使用构造函数初始化它们的值,如下所示。它正在工作,但我担心这样做是否是一种正常的Java约定(在构造函数中调用set方法是否正常?) 我可以想到的另一种方法是调用一个空构造函数,然后在main方法中逐个调用set方法来设置值。我觉得第二种方法很乏味。请告知我所做的是否符合Java约定,或者是否有更好的方法。请告诉我是否需要发布更多代码以使我的问题更清楚。如果它更有意义的话,我可以把它全部贴出来。多谢各位 public Person(String foreName,Str

我设置了许多set方法,并使用构造函数初始化它们的值,如下所示。它正在工作,但我担心这样做是否是一种正常的Java约定(在构造函数中调用set方法是否正常?)

我可以想到的另一种方法是调用一个空构造函数,然后在main方法中逐个调用set方法来设置值。我觉得第二种方法很乏味。请告知我所做的是否符合Java约定,或者是否有更好的方法。请告诉我是否需要发布更多代码以使我的问题更清楚。如果它更有意义的话,我可以把它全部贴出来。多谢各位

public Person(String foreName,String surName, int age, double height, String gender){
        personCount++; 
        setForeName(foreName);
        setSurName(surName);
        setAge(age);
        setHeight(height);
        setGender(gender); 
    }

如果使用
不会绕过setter中定义的验证规则,那么这只是一个品味问题:

public Person(String foreName,String surName, int age, double height, String gender){
    personCount++; 
    this.foreName = foreName;
    //same goes for the rest of the params
}

这不仅仅是品味的问题。如果
setXXX()
方法中没有任何额外的逻辑,惯例是直接在构造函数中分配属性:

this.foreName = foreName;
this.surName = surName;
。。。等等但是如果
setXXX()
方法中有额外的逻辑,那么您应该根据需要使用它们。例如,调用日志逻辑或类似功能:

public void setForeName(String pForeName) {
    log.info("setting new foreName value: " + pForeName);
    this.foreName = pForeName;
}

查看
setForeName()
中的最后一行如何与执行直接赋值相同?还要注意,调用
setXXX()
可能会带来非常非常小的性能代价(很可能是由JIT编译器优化的)。在正常情况下,您首先应该优化可读性和清晰性,在这里使用直接赋值是首选选项。

在构造函数中使用set方法完全可以。我不知道使用
this.var=var
是否真的是一种约定,但这很好。

我认为在构造函数中调用setter没有任何问题。事实上,如果您计划让setter携带额外的逻辑,那么使用该方法可以提供更好的封装。

为什么要在构造函数中调用set方法? 试试这个


请记住,setter是公开的,这意味着它可以被其子类覆盖。当您创建一个子类以修改其一个setter的行为时,它在子类的构造函数中要做的第一件事就是调用其超类的构造函数,这意味着这些setter和其中添加的逻辑将在您实际需要修改其中一个setter的行为时执行

引用有效的Java项目17

构造函数不能直接或间接调用可重写的方法 间接地。如果违反此规则,将导致程序失败。 超类构造函数在子类构造函数之前运行,因此 子类中的重写方法将在 子类构造函数已运行。如果重写方法依赖于任何 由子类构造函数执行初始化时,该方法将 表现不如预期


到目前为止,我学到的是在构造函数中提供setter和getter,然后在您想要使用它的任何方法(在您的案例中是main)中实际设置和获取它。但是,如果你的领域是私有的。如果它们像您的情况一样是公共的,那么我会说在字段或构造函数中设置变量,然后在需要使用它们的地方/任何时候调用它们会更有意义

构造函数可以直接为类变量赋值(不使用setter)
this.foreName=foreName
Yes;构造函数可以调用函数。请注意,如果派生类重写了这些函数,可能会出现问题。这会绕过可能在setter中设置的所有验证规则,因此您必须对此非常小心。每次只使用setter更安全(将来可能添加验证规则时,这将导致构造函数中有2种样式)。或者,在实现setter时,您可以对其进行全面更改,这取决于这方面的首选项。我使用set方法,因为我在其中使用了一些条件。例如,我不希望年龄有一个负值。我不想开始在构造函数中放置if语句。因此,当您跳过set方法,直接从私有变量直接通过构造函数(例如:this.var=var)为其赋值时,我让set方法处理条件。这也被视为setter吗?不,它被视为“为类成员赋值”。
private String foreName;
private String surName;
private int age;
private double height;
private String gender


public Person(String foreName,String surName, int age, double height, String gender){
        personCount++; 
        this.foreName = foreName;
        this.surName = surName;
        this.age = age;
        this.height = height;
        this.gender = gender; 
    }

/// setter and getter methods of above private variables..