Java:按字符串更改代码

时间:2015-11-16 12:04:46

标签: java list

我有这行代码:

String msg = "What's the capital in " + nyttLista.get(slumpLand).land + "?";

我想在.land.stad之间切换。我可以这样做而不必复制这行代码吗?

我尝试创建一个String,在" land"之间切换。和" stad":

String i = "land";
nyttLista.get(slumpLand).i;

我可以做类似的事吗?

4 个答案:

答案 0 :(得分:3)

您有几个选择,每个选项都有各自的优缺点。

最简单,几乎肯定适合您的用例是简单的“if”语句

SomeObject obj = nyttLista.get(slumpLand);
String value;
if(<some condition>) {
   value = obj.land;
} else {
   value = obj.stad;
}
String msg = "What's the capital in " + value + "?";

如果是直接的,可读但有点冗长,如果你添加了许多不同的条件,它将会爆炸。

您可以使用三元运算符

缩短时间
SomeObject obj = nyttLista.get(slumpLand);
String msg = "What's the capital in " + (<some condition> ? obj.land : obj.stad) + "?";

但是以可读性和可扩展性为代价(后者可能对您不重要)。

您可以使用反射

String fieldToUse = <some logic to return "land" or "stad".
Field field = SomeObj.class.getField(fieldToUse);
SomeObject obj = nyttLista.get(slumpLand);
"What's the capital in " + field.get(obj).toString() + "?";

我不会在这个用例中这样做,但是当你有TEH DYNAMICS时它会很有用(这是非常罕见的,你可以忽略这个选项)。

如果使用Java 8,您可以使用功能和其他有趣的东西(或Strategy pattern)。但实际上只适用于lolz。

Function<SomeObject, String> using;
if(<some condition>) {
   using = (a) => a.land;
} else {
   using = (a) => a.stad;
}


"What's the capital in " + using.apply(nyttLista.get(slumpLand)) + "?";

当您有许多不同的选项或希望传递部分算法时,它非常有用。

您可以使用规则引擎,但我们在反思中变得愚蠢。当你有很多规则时很好,但在上面的问题中毫无意义。

你可以推动逻辑。因此SomeObject有一个getThingie方法,知道何时返回landstad。在内部,它将使用上述之一实现,但调用者不需要关心。我不知道决定landstad所需的逻辑,但这可能是我推荐的,使用if语句在内部实现的。

答案 1 :(得分:2)

不,你想要实现它的方式是不可能的。

但你可以像这样写。基本上,它不是直接访问变量,而是使用带变量的方法作为参数。基于此参数,可以使用常量标志传递,它将确定它将返回的内容。

public class Test {

    private String a = "A";
    private String b = "B";

    public static final int LAND = 0;
    public static final int STAD = 1;

    public static void main(String[] args) {
        Test test = new Test();
        int option = Test.LAND;
        System.out.println(test.getValue(option));
        option = Test.STAD;
        System.out.println(test.getValue(option));
    }

    public String getValue(int option) {
        if(option == LAND) {
            return a;
        } else if (option == STAD) {
            return b;
        }
        return null;
    }
}

答案 2 :(得分:2)

您可以使用反射来完成此任务。

将变量名存储在一个变量中,就像我的情况一样,它是'variabeName',并且根据该变量的值,您将获得相应fieeld的值。

Halaqati_Test2.RingID = view_stdwithrings.rg_id

答案 3 :(得分:1)

您可以执行以下操作:

String msg = "What's the capital in " + 
    (i.equals("land") ?
        nyttLista.get(slumpLand).land :
        nyttLista.get(slumpLand).stad)
    + "?";