【发布时间】:2015-01-04 17:58:57
【问题描述】:
人物类:
public class Person {
private String firstName;
private String lastName;
public Person(String firstname,String lastname) throws InvalidDataException
{
setFirstname( firstname);
setLastname(lastname);
}
public void personFirstName(String firstName) throws InvalidDataException {
setFirstname(firstName);
}
public void personLastName(String lastname) throws InvalidDataException {
setLastname(lastname);
}
public String getFirstName() {
return firstName;
}
public String getlasttName()
{
return lastName;
}
protected final void setFirstname(String firstname) throws InvalidDataException{
if( firstname == null ||firstname.length() < 1) {
throw new InvalidDataException("First Name Cannot be Empty");
}
this.firstName=firstname;
}
protected final void setLastname(String lastname) throws InvalidDataException {
if( lastname == null ||lastname.length() < 1) {
throw new InvalidDataException("Last Name Cannot be Empty");
}
this.lastName = lastname;
}
}
教授级:
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
setProfessorID(professorID);
}
public void setID(String professorID) throws InvalidDataException{
setProfessorID(professorID);
}
public String getID()
{
return this.professorID;
}
private void setProfessorID(String ID) throws InvalidDataException{
if( ID == null ||ID.length() < 1) {
throw new InvalidDataException("ID Cannot be Empty");
}
this.professorID=ID;
}
public void printData()
{
System.out.println("Professor ID: " + this.getID() + " First Name: " + this.getFirstName() + " Last Name: " + this.getlasttName());
}
}
我对实现 setter 并在我的子类中调用它们进行了一些研究。通过将它们声明为受保护的和最终的,我可以防止子类覆盖它并执行不需要的行为。我的问题是,我现在可以摆脱 personFirstName() 和 personLastName() 吗?我的构造函数不使用它,它们调用受保护的 final setFirstname 和 setLastname()。摆脱 public setter 会在以后的开发中引起问题吗?
【问题讨论】:
-
@T.J.Crowder - 你会建议删除 setFirstName() 吗?我的问题是,如果我这样做,以后会造成问题吗?
-
@T.J.Crowder - 我在其他地方读到过,这样做是不可取的。因为我在构造函数中调用了setter,并且我读到不建议使用可以覆盖的方法调用构造函数。
-
啊,好吧,关键是要避免从构造函数调用可能被覆盖的方法。我理解了。 :-)
标签: java inheritance polymorphism