构造运行时调用的方法名
Construct the name of the method to be called at runtime
我正在学习 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);
}
这不是一个具体的问题。我只是在考虑是否可以 assemble 对象名称。
您可以在 reflection 之前做到这一点,但对于这种情况显然有点矫枉过正。
这种方法怎么样?:将您的对象存储在数组(或列表)中,然后使用索引访问所需的对象。
请注意,我假设所有对象都相同 class 或者至少它们具有父子 class 关系,正如@ChetanKinger 在下面的评论中指出的那样。
public void methodCaller(int methodNumber) {
myArrayOfObjects[methodNumber].setFill(color.RED);
}
PS:实际上,您正在尝试编写 "object" 名称,而不是方法名称。在那种情况下,你真的需要使用 Reflection API
您可以使用三种方法来解决问题(反射是我推荐的最后一个选项):
选项 1:采用 Strategy 模式
如果method1
和method2
不是类的相关对象。使用 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
假设 method1
和 method2
通过共同的父或通过父子关系相关,创建一个 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
而不是基本的 array
或 List
可以让您将有意义的名称关联到您的方法调用。 HashMap
是对象的一种 Factory
。用作 Map
键的 String
常量可以定义为 enum
。
选项 3:使用反射:
对于这种特殊情况,我不建议这样做,但如果您必须这样做,请查看 this 关于如何实现这种槽反射的答案。
我正在学习 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);
}
这不是一个具体的问题。我只是在考虑是否可以 assemble 对象名称。
您可以在 reflection 之前做到这一点,但对于这种情况显然有点矫枉过正。 这种方法怎么样?:将您的对象存储在数组(或列表)中,然后使用索引访问所需的对象。 请注意,我假设所有对象都相同 class 或者至少它们具有父子 class 关系,正如@ChetanKinger 在下面的评论中指出的那样。
public void methodCaller(int methodNumber) {
myArrayOfObjects[methodNumber].setFill(color.RED);
}
PS:实际上,您正在尝试编写 "object" 名称,而不是方法名称。在那种情况下,你真的需要使用 Reflection API
您可以使用三种方法来解决问题(反射是我推荐的最后一个选项):
选项 1:采用 Strategy 模式
如果method1
和method2
不是类的相关对象。使用 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
假设 method1
和 method2
通过共同的父或通过父子关系相关,创建一个 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
而不是基本的 array
或 List
可以让您将有意义的名称关联到您的方法调用。 HashMap
是对象的一种 Factory
。用作 Map
键的 String
常量可以定义为 enum
。
选项 3:使用反射:
对于这种特殊情况,我不建议这样做,但如果您必须这样做,请查看 this 关于如何实现这种槽反射的答案。