假设我有两个类似的课程:
public class First {
public static final String ONE = "1";
public static final String TWO = "2";
public static final String THREE = "3";
}
public class Second {
public static final String ONE = "one";
public static final String TWO = "two";
public static final String THREE = "three";
}
现在在其他课程中使用其中一个:
public class Third {
//....
@Override
public String toString()
{
System.out.println( First.ONE );
}
}
但是我现在正在尝试做的是制作一种选择器,让我们说类Third的构造函数获取布尔值并基于它选择使用哪个类,但我不想让if(..)语句无处不在,原因太多了。
所以在抽象中我喜欢这个:
public class Third {
//some global var with reference? to static class
public Third(boolean first)
{
if( first ) {
//set class First as source of static fields
} else {
//set class Second
}
}
//....
@Override
public String toString()
{
System.out.println( globalVariableWithReference.ONE );
}
}
是否可以在不提出这些课程的情况下进行?
答案 0 :(得分:2)
您可以使用带有getter方法的接口,然后让这两个类实现该接口(并在调用getter方法时返回它们各自的值)。然后你可以创建一个映射来映射布尔值和两个实现类(通过接口),并调用映射到布尔值的对象。当然,这需要您创建每个类的对象,但您会得到相同的行为。
另一种选择是创建一个包装类,它将if
/ else
逻辑包装到自己的静态方法中,并根据布尔值从两个类中返回适当的值。虽然您需要为此包装器clasee编写if
/ else
逻辑,但您不需要多次编写它,只需调用包装类的方法
答案 1 :(得分:0)
您可以使用反射:
Class x = if (first) First.class : Second.class;
String one = (String) x.getField("ONE").get(null);