构造要在运行时调用的方法的名称

时间:2015-06-02 15:03:36

标签: java design-patterns reflection

我正在学习Java,而且我对此很新。这是我的一些伪代码的问题:

public void objectCaller(int objectNumber) {

   switch(objectnumber) {

     case 1:
     object1.setFill(color.RED);
     break:

     case 2:
     object2.setFill(color.RED);
     break;
     .
     .and so on

    }
}

有没有办法以类似的方式替换它?

public void objectCaller(int objectNumber) {

   (object + objectnumber).setFill(color.RED);

}

这不是具体问题。我只是在考虑是否可以组装对象名称。

2 个答案:

答案 0 :(得分:4)

您可以使用三种方法来解决问题(反射是我建议的最后一个选项):

选项1:使用Strategy模式

如果method1method2不是相关类的对象。使用Strategy模式如下:

  public interface Filler {
     public void fill(Color color);
  }

创建两个fill颜色不同的类:

 public class FloodFill implements Filler {
     public void fill(Color color) {
         //fill using flood fill algorithm
     }
 }

 public class QuickFill implements Filler {
     public void fill(Color color) {
        //fill using quick fill algorithm
     }
 }

然后,您可以使用下面介绍的Map方法:

选项2:使用HashMap

假设method1method2通过共同父项或通过父子关系相关,请创建HashMap并使用method1和method2对象预填充它:

 Map<String,Filler> methods = new HashMap<>();
 FloodFill method1 = new FloodFill();
 QuickFill method2 = new QuickFill();
 map.put("FloodFill",method1);
 map.put("QuickFill",method2);

然后,您可以将methodCaller方法更改为:

public void methodCaller(String method,Color color) {
     methods.get(method).fill(color); 
}

客户端代码可以如下所示:

methodCaller("FloodFill",Color.RED);
methodCaller("QuickFill",Color.GREEN);

使用HashMap代替基本arrayList,您可以将有意义的名称与方法调用相关联。 HashMap是对象的Factory种类。用作String密钥的Map常量可以定义为enum

选项3:使用反射:

对于这个特殊情况,我不建议这样做,但如果必须,请查看this如何实现这种反射的答案。

答案 1 :(得分:2)

你可以通过reflection来做到这一点,但对于这种情况显然有点矫枉过正。 这种方法怎么样?:将对象存储在数组(或列表)中,然后使用索引访问所需的对象。 请注意,我假设所有对象属于同一个类,或者至少它们具有父子类关系,正如@ChetanKinger在下面的注释中指出的那样。

start_urls

PS:事实上,你正在尝试撰写“对象”名称,而不是方法名称。在这种情况下,您确实需要使用Reflection API