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你知道这种方法相对于通过构造函数传递值的方法有什么优点吗?