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



我正在学习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);
}

这不是一个具体的问题。我只是在想是否可以将对象名称组合起来

有三种方法可以用来解决这个问题(反射是我推荐的最后一种方法):

选项1:使用策略模式

如果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。作为Map键的String常量可以定义为enum

选项3:使用反射

对于这种特殊情况,我不建议这样做,但如果你必须这样做,请看看如何通过反射实现这一目标。

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

public void methodCaller(int methodNumber) {
   myArrayOfObjects[methodNumber].setFill(color.RED);
}

PS:事实上,你正在试图组成"对象"名称,而不是方法名称。在这种情况下,你真的需要使用反射API

相关内容

  • 没有找到相关文章

最新更新