Java 使用变量类型初始化对象
我有一个Java 使用变量类型初始化对象,java,class,Java,Class,我有一个Worker接口和一种方法: interface Worker { public void work() } 我有两个类实现了Worker class RoadWorker implements Worker { public void setPropertyA() {} public void work() {} } 另一个, class GardenWorker implements Worker { public void setProperty
Worker
接口和一种方法:
interface Worker {
public void work()
}
我有两个类实现了Worker
class RoadWorker implements Worker {
public void setPropertyA() {}
public void work() {}
}
另一个,
class GardenWorker implements Worker {
public void setPropertyB() {}
public void work() {}
}
在我的应用程序中
类-基于某个输入标志-我想实例化一种特定类型的工作者
class Application {
// flag
String whichWorker = "Road";
// instantiate
if (whichWorker == "Road") {
RoadWorker worker = new RoadWorker();
worker.setPropertyA();
} else {
GardenWorker worker = new GardenWorker();
worker.setPropertyB();
}
// use
worker.work(); <----- OF COURSE THIS DOES NOT WORK (no reference)
类应用程序{
//旗
字符串whichWorker=“Road”;
//实例化
如果(其中工人=“道路”){
道路工人=新道路工人();
worker.setPropertyA();
}否则{
GardenWorker=新的GardenWorker();
worker.setPropertyB();
}
//使用
工人。工作();
或者在子类构造函数中传递特定的属性值
或者在子类构造函数中传递特定的属性值。使用构造函数设置属性或工厂模式
第一种解决方案比较简单,但有其局限性:
interface Worker {
public void work()
}
class RoadWorker implements Worker {
RoadWorker(PropertyA property) {
this.property = property;
}
}
void foo() {
Worker worker = null;
if (whichWorker.equals("road")) {
worker = new RoadWorker(property);
}
worker.work();
}
两个旁注:
- 不要将事物与==进行比较,而是使用equals
- 使用枚举而不是字符串来切换工作类型,它们正是为此目的而存在的
如果您需要更大的灵活性,那么a可能更合适。使用构造函数设置属性或工厂模式
第一种解决方案比较简单,但有其局限性:
interface Worker {
public void work()
}
class RoadWorker implements Worker {
RoadWorker(PropertyA property) {
this.property = property;
}
}
void foo() {
Worker worker = null;
if (whichWorker.equals("road")) {
worker = new RoadWorker(property);
}
worker.work();
}
两个旁注:
- 不要将事物与==进行比较,而是使用equals
- 使用枚举而不是字符串来切换工作类型,它们正是为此目的而存在的
如果您需要更大的灵活性,那么a可能更合适。您可以让辅助实现的构造函数执行特定于这些实现的操作
道路工人:
class RoadWorker implements Worker {
public RoadWorker() {
this.setPropertyA();
}
public void setPropertyA() {}
public void work() {}
}
园丁工人:
class GardenWorker implements Worker {
public GardenWorker() {
this.setPropertyB();
}
public void setPropertyB() {}
public void work() {}
}
然后删除对if语句中的setProperty
方法的调用:
class Application {
// flag
String whichWorker = "Road";
Worker worker;
// instantiate
if (whichWorker.equals("Road")) {
worker = new RoadWorker();
} else {
worker = new GardenWorker();
}
// use
worker.work();
注意:我将whichWorker==“Road”
更改为whichWorker.equals(“Road”)
,因为对于字符串比较,您需要使用equals
而不是=,您可以让worker实现的构造函数执行特定于这些实现的操作
道路工人:
class RoadWorker implements Worker {
public RoadWorker() {
this.setPropertyA();
}
public void setPropertyA() {}
public void work() {}
}
园丁工人:
class GardenWorker implements Worker {
public GardenWorker() {
this.setPropertyB();
}
public void setPropertyB() {}
public void work() {}
}
然后删除对if语句中的setProperty
方法的调用:
class Application {
// flag
String whichWorker = "Road";
Worker worker;
// instantiate
if (whichWorker.equals("Road")) {
worker = new RoadWorker();
} else {
worker = new GardenWorker();
}
// use
worker.work();
注意:我将whichWorker==“Road”
更改为whichWorker.equals(“Road”)
,因为要进行字符串比较,需要使用equals
,而不是=,您可以在设置worker实例的属性时使用其正确的实例类型强制转换worker实例
比如说
if (whichWorker == "Road") {
worker = new RoadWorker();
((RoadWorker)worker).setPropertyA();
} else {
worker = new GardenWorker();
((GardenWorker)worker).setPropertyB();
}
这应该可以工作您可以在设置worker实例的属性时使用其正确的实例类型强制转换该实例
比如说
if (whichWorker == "Road") {
worker = new RoadWorker();
((RoadWorker)worker).setPropertyA();
} else {
worker = new GardenWorker();
((GardenWorker)worker).setPropertyB();
}
这应该可以用不要使用==来比较字符串!!!!@ajb-ok,谢谢你指出outDon't use==来比较字符串!!!!@ajb-ok,谢谢你指出outThank。这对我来说很简单。你知道这种方法与通过构造函数传递值的方法相比有什么优点吗?谢谢。这对我来说很简单。Wou你知道这种方法相对于通过构造函数传递值的方法有什么优点吗?