将Java引用传递给对象链的最佳方法

时间:2012-05-05 16:32:39

标签: java parameter-passing

让我们考虑一系列这样的对象:

Earth->Continent->Country->City->name

我们还要考虑Earth.classpublic static void main(String[] args)

使用命令行选项执行应用程序时,例如Barcelona,在不引入中间参数的情况下,将其传递给City对象的最佳方法是什么?

在程序执行期间的不同阶段创建对象。

我们应该使name变量为静态还是使用IoC,例如Spring或Google Guice? 还有其他选择吗?

欢迎任何想法。

3 个答案:

答案 0 :(得分:2)

  • 我最喜欢IOC这项任务。让IOC在构建城市时传递依赖关系。
  • 替代方法:使用静态服务注册表,可以查询该值。纽约市可以从服务注册中心获得其名称。
  • 替代方法:在层次结构上实现复合模式,包括可以返回City的函数,例如find。然后,您只需查询并设置earth.find(BarcelonaID).setName(args[0]);
  • 即可

PicoContainer中IoC解决方案的示例:

PicoContainer container = new DefaultPicoContainer();
container.addComponent(Earth.class);
container.addComponent(Continent.class);
container.addComponent(Country.class);
container.addComponent(City.class, new ConstantParameter(cityName));

City barcelona = container.getComponent(City.class);

答案 1 :(得分:2)

您可以从上到下构建数据结构 - Continent构建城市,或者自下而上 - main构建城市并将其传递到国家/地区,或使用某种组合。 DI赞成后者。

public static void main(String... argv) {
  // Bottom up.
  City city = new City(/* args relevant to city */);
  Country country = new Country(city, /* args relevant to country */);
  Continent continent = new Continent(country, /* args relevant to continent */);
  Planet planet = new Planet(continent, /* args relevant to planet */);
}

class City {
  City(/* few parameters */) { /* little work */ }
}
class Country {
  Country(/* few parameters */) { /* little work */ }
}
...
class Planet {
  Planet(/* few parameters */) { /* little work */ }
}

可以比自上而下更清洁:

public static void main(String... argv) {
  // Top down.
  Planet earth = new Planet(
    /* all the parameters needed by Earth and its dependencies. */);
}
class Planet {
  Planet(/* many parameters */) { /* lots of work */ }
}
...

DI民众认为,自下而上的构造会产生更多可维护和可测试的代码,但您不需要DI框架来使用它。

答案 2 :(得分:1)

在我看来,这是您可以想象的Visitor模式的最佳用例。 基本上,应该有一个类Parameters应该包含所有参数。可以使用Parameters类访问需要一组参数的每个对象。然后,对象可以将参数传递给子节点,这些子节点知道要使用哪些参数以及如何使用。 在您的情况下,可以这样做:

public interface IParameterized{
   public void processParameters(Parameters param);
}

public class Earth implements IParameterized{
   public Earth(){
      // Create all countries here and store them in a list or hashmap 
   }
   public void processParameters(Parameters param){
      // find the country you want and pass the parameters to it
      country.processParameters(param);
   }
} 

public class Country implements IParameterized{
   public Country(){
      // Create all cities that belong to this country
   }
   public void processParameters(Parameters param){
      // find the city you want and pass the parameters to it
      city.processParameters(param);
   }
} 

public class City implements IParameterized{
   public City(){
      // Create city...
   }
   public void processParameters(Parameters param){
      // Do something with the parameter
   }
}

修改 要连接点,可以按以下方式使用:

public static void main(String... argv) {
     Parameters params = new Parameters();
     // Populate params from the command line parameters
     Earth earth = new Earth();

     // Earth takes the responsibilty of processing the parameters
     // It will delegate the processing to the underlying objects in a chain
     earth.processParameters(params);
}

作为旁注,您还可以查看Chain Of Responsibility设计模式