在c ++中,我会使用int / pointer的映射来实现这样的函数:
std::map = {
{Code::Value1, Handler::value1Handler},
{Code::Value2, Handler::value2Handler},
};
为了避免做很多像是
if (value == Code::Value1)
value1Handler();
if (value == Code::Value2)
value2Handler();
if (value == Code::Value3)
value3Handler();
但我没有找到在Java中这样做的好方法,是否可能?
答案 0 :(得分:4)
我意识到,如果返回类型很重要,您希望将关键字T
与相应的操作Consumer<T>
(或Function<K, V>
)关联起来。
不幸的是,我们没有地图文字,所以简而言之,可以使用init块生成HashMap
子类:
Map<T, Consumer<T>> map = new HashMap<T, Consumer<T>>() {{
put(k1, v -> {/* value handler 1 */});
put(k2, v -> {/* value handler 2 */});
}};
作为地图值,您可以使用键传递要执行的操作。例如,
v -> System.out.println(v)
如果此类操作是单个操作,则可以使用方法引用替换它:
System.out::println
(我理解valueXHandler
返回一个地图值,他们不仅仅是消费者。因此,Function<K, V>
是我们的方式)
通常,我会写一个mapper,它将一个键转换为一个值并返回该值:
public <K, V> V mapToValue(K key, Function<K, V> function) {
return function.apply(key);
}
它的用法很简单:
map.put(k1, mapToValue(k1, k1 -> v1));
答案 1 :(得分:3)
一个好的(大多数时候,正确的)解决方案是使用多态。使用具有许多子项的抽象类(或接口),该子项具有所需操作的不同实现(相关函数)。 然后,使用工厂函数根据值返回(或生成)适当的对象类型,并运行其动作函数。
对于非常小的程序而言,这可能不是正确的解决方案,但在处理实际项目时,这是一种非常好的做法(并且在诸如State,Strategy等设计模式中实现)。
答案 2 :(得分:0)
您可以使用开关执行此操作:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
public class SwitchDemo {
public static void main(String[] args) {
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
case 3: monthString = "March";
break;
case 4: monthString = "April";
break;
case 5: monthString = "May";
break;
case 6: monthString = "June";
break;
case 7: monthString = "July";
break;
case 8: monthString = "August";
break;
case 9: monthString = "September";
break;
case 10: monthString = "October";
break;
case 11: monthString = "November";
break;
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
System.out.println(monthString);
}
}
答案 3 :(得分:0)
你可以采用3种方法,即: -
使用哈希映射来利用一对存储。
使用switch case会有助于避免在if-else条件下进行多次检查。
你可以很好地利用C ++的OOP概念并使用多态(使用多个子节点或多个接口)。