具有静态内容选择器的类

时间:2012-05-18 12:07:35

标签: java

假设我有两个类似的课程:

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 );
    }
}

是否可以在不提出这些课程的情况下进行?

2 个答案:

答案 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);