Java 私有 Setter 继承

Java Inheritance with Private Setter

我创建了一个人 class,以及一个继承自它的 class 教授 class。现在,我已经在 Person class 和 Professor class 中声明我的 setter 是私有的。我希望构造函数通过调用设置器并执行验证来设置变量。我做的对吗?如果不是,我可以做些什么来纠正它?

人员类别:

public class Person {


private String firstName;
private String lastName;

public Person(String firstname,String lastname) throws InvalidDataException
{
    setFirstName(firstname);
    setLastName(lastname);
}

public String getFirstName() {
    return firstName;
}

private void setFirstName(String firstName) throws InvalidDataException {

 if ( firstName == null || firstName.length() < 1) {
      throw new InvalidDataException("Person Must have First Name");}

    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

private void setLastName(String lastName) throws InvalidDataException {

     if ( lastName == null ||  lastName.length() < 1) {
          throw new InvalidDataException("Person Must have Last Name");}

    this.lastName = lastName;
}

教授class

public class Professor extends Person {


private String  professorID;

public Professor(String professorID,String firstname, String lastname) throws InvalidDataException {
    super(firstname, lastname);
    // TODO Auto-generated constructor stub
    this.setID(professorID);

}

private void setID(String professorID) throws InvalidDataException{

     if ( professorID == null ||professorID.length() < 1) {
          throw new InvalidDataException("Person Must have ID");}
    this.professorID = professorID;
}

public String getID()
{
    return this.professorID;
}


public void printData()
{
     System.out.println("Professor ID: " + this.getID() + " First Name: " + this.getFirstName() + " Last Name: " + this.getLastName());
}

}

考虑到您的“setters”主要检查字符串是否为 null 或空,您可能有一个静态或实用方法来执行此操作,并在构造函数中调用它 ( and/or public setter) 在分配给 class 成员之前。

public class Person {

    protected void check( String s, String msg ){
        if( s == null ||s.length < 1) {
            throw new InvalidDataException(msg);
        }
    }

    public Person(String firstname,String lastname) throws InvalidDataException{
        check( firstname, "Person's first name missing" );
        check( lastname, "Person's last name missing" );
        this.firstname = firstname;
        this.lastname = lastname;
    }

    public void setFirstname( String firstname ){
        check( firstname, "Person's first name missing" );
        this.firstname = firstname;
    }
}

但是 bean 不应该需要这样的守卫。如果有 GUI,GUI 应该进行验证,只将正确的值传递给对象构造。

将 setter 声明为 private 是一种不好的做法。因为 setter 的目标是从 class 实例的 class 之外调用它们。如果你真的想用构造函数填充你的 class 属性,你可以创建一个私有函数来构建你的 class。 ** ps:如果您的 class 属性很容易填充,您可以在构造函数中填充它们。您不需要任何支持函数。

最好的方法是将 Person class 成员设置为受保护的而不是私有的。 无论如何,setter 和 getter 在 OOD 中应该是 public。