初始化变量类型的对象

炸土豆饼

我有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() {}
}

在我的Application课堂上-基于一些输入标志-我想实例化一种特定类型的worker ...

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)

所以,我尝试了-

class Application {
    // flag
    String whichWorker = "Road";
    Worker worker;

    // instantiate
    if (whichWorker == "Road") {
        worker = new RoadWorker();
        worker.setPropertyA(); <----- DOES NOT WORK 
    } else {
        worker = new GardenWorker();
        worker.setPropertyB(); <----- DOES NOT WORK 
    }

    // use
    worker.work();  

我的问题是-如何设计我的程序来实现此要求?我知道一个粗略的选择是将worker定义为,Object但是随后我将不得不做很多我不想做的类型转换。有人可以建议吗?

杰克

使用构造函数设置属性或工厂模式。

第一种解决方案比较简单,但有其局限性:

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
  • 使用一个Enum而不是一个字符串来切换工作程序类型,为此,它们存在是正确的

如果您需要更大的灵活性,则工厂方法模式可能更适合。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章