Java 程序获取非null子项并继续对其执行操作
我基于父类创建了三个子类 当我的程序运行时,其中一个子类将被实例化,我有一些操作需要非空的子对象 下面是我的一些代码示例: 家长:Java 程序获取非null子项并继续对其执行操作,java,inheritance,Java,Inheritance,我基于父类创建了三个子类 当我的程序运行时,其中一个子类将被实例化,我有一些操作需要非空的子对象 下面是我的一些代码示例: 家长: public class Person { // code here doMore(Operation operation) { //code here } } 操作等级: public class Operation { Person person; public Operation(Pe
public class Person {
// code here
doMore(Operation operation) {
//code here
}
}
操作等级:
public class Operation {
Person person;
public Operation(Person person) {
this.person = person;
}
}
儿童班:
public class Doctor extends Person {
// code here
}
public class Lawyer extends Person {
// code here
}
public class Pilot extends Person {
// code here
}
主程序:
// String temp is calculated
Doctor doctor = null;
Lawyer lawyer = null;
Pilot pilot = null;
if (temp.equals("doctor")) {
doctor = new Doctor();
Operation operation = new Operation(doctor);
doctor.doMore(operation);
} else if (temp.equals("lawyer")) {
lawyer = new Lawyer();
Operation operation = new Operation(lawyer);
lawyer.doMore(operation);
} else {
pilot = new Pilot();
Operation operation = new Operation(Pilot);
pilot.doMore(operation);
}
正如您所看到的,根据temp的值,三个子类中只有一个将被实例化,并且只有一个对象是非null的
在实例化之后,我还有两个操作将使用新创建的对象。现在,重复同样的两行三次似乎是多余的
有没有办法简化这两行代码,使其只使用一次?我可以在这里使用继承的一些特性吗?事实上,这非常简单。虽然这不是我个人编写代码的方式,但您可以通过执行以下操作获得所需的结果:
Person person = null;
if (temp.equals("doctor")) {
person = new Doctor();
} else if (temp.equals("lawyer")) {
person = new Lawyer();
} else {
person = new Pilot();
}
Operation operation = new Operation(person);
person.doMore(operation);
由于Person
是所有三个类都实现的接口,因此可以将它们都视为Person
无论如何,我会编写一个enum
来封装您所比较的字符串,并编写一个switch
语句。也就是说,您还可以在字符串上切换:
switch (temp) {
case "doctor": break;
case "lawyer": break;
default: break;
}
事实上,这很简单。虽然这不是我个人编写代码的方式,但您可以通过执行以下操作获得所需的结果:
Person person = null;
if (temp.equals("doctor")) {
person = new Doctor();
} else if (temp.equals("lawyer")) {
person = new Lawyer();
} else {
person = new Pilot();
}
Operation operation = new Operation(person);
person.doMore(operation);
由于Person
是所有三个类都实现的接口,因此可以将它们都视为Person
无论如何,我会编写一个enum
来封装您所比较的字符串,并编写一个switch
语句。也就是说,您还可以在字符串上切换:
switch (temp) {
case "doctor": break;
case "lawyer": break;
default: break;
}
很多取决于操作类的定义。@tsolakp谢谢。它也被添加到我的帖子中。temp=“doctor”
将始终返回真实值(这是一个赋值)。您可能应该使用temp.equals(“医生”)
,它实际上可以进行字符串比较。@alephtwo很好的捕捉。我已经修改过了。谢谢。很多都取决于操作类的定义。@tsolakp谢谢。它也被添加到我的帖子中。temp=“doctor”
将始终返回真实值(这是一个赋值)。您可能应该使用temp.equals(“医生”)
,它实际上可以进行字符串比较。@alephtwo很好的捕捉。我已经修改过了。谢谢。此外,如果你愿意,你可以将ifs移动到a。然后您将拥有Person-Person=createPerson(temp)代码>谢谢你的回答。但是我想知道,如果Person是一个抽象类,我还可以这样做吗?如果Doctor
等都扩展Person
,你可以这样做。此外,如果你愿意,你可以将ifs移动到a。然后您将拥有Person-Person=createPerson(temp)代码>谢谢你的回答。不过我想知道,如果Person是一个抽象类,我还可以这样做吗?你可以,只要Doctor
等都扩展Person
。