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。
我创建了一个人 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。