Java:使用生成的字符串

时间:2017-05-05 10:33:58

标签: java object

我想通过使用生成的字符串来调用对象。

如您所见,name正在正确生成。 此外,获取对象的方法工作正常。 但是我不能使用name来引用对象,即使这是对象的名称。

为什么?我该如何解决这个问题?

public class FrameTest{    
    public static void main(String[] args) { 
        ObjectMethod first_object = new ObjectMethod(); //instanciate object
        first_object.setCost(2.5);

        String object = "first";
        String one = "object";
        String name = object + "_" + one;

        System.out.println(name);
        System.out.println(first_object.getCost());
        System.out.println(name.getCost()); //this line does not work
    }
}

public class ObjectMethod{
    public double value;

    public void setCost(double cost) {
        value = cost;
    }

    public double getCost() {
        return value;
    }
}

5 个答案:

答案 0 :(得分:2)

你必须明白:Java不是ruby或python或其他一些动态语言。

没有魔法连接允许您将对String的引用转换为其他内容。

换句话说:你把" object_one"进入一个字符串对象并不允许你处理该字符串就像一些实际的变量object_one

进入该方向的Java的一个特征是reflection。但这确实是一个高级话题;在你研究之前,你应该了解Java的真正的基础知识。所以,最好开始here

我的意思是:作为#34;苗条的回答"指出:您可以使用Map来实现某种"名称调用"功能。但问题是:那就是"而不是你在Java中做事情的方式"。 Java是一种静态编译的语言;当用户试图突破该系统并执行依赖于运行时平面字符串解析的事情时,使用Java是没有意义的。

答案 1 :(得分:2)

我能想到的最接近你所描述的内容,没有使用Reflection(如果你问这个问题,你还没准备好反射)就是有一个字符串映射到对象。

  Map<String,Runnable> options = new HashMap<>();
  options.add("getCost", new CostGetter(...));
  options.add("getDescription", new DescriptionGetter(...));

  String command = getCommandFromUi();
  options.get(command).run();

可能是Callable而不是Runnable。它可能是您自己的界面。在Java 8中,它可以是Supplier,你可以传递lambdas:

  options.add("getCost", () -> currentUser.price());

查看任何有关设计模式的书中的命令和策略模式。

答案 2 :(得分:1)

这不会按预期工作,因为您试图在字符串名称对象上调用 getCost()名称 - 只是一个字符串,但不是 ObjectMethod 类的对象。

答案 3 :(得分:0)

您无法调用name.getCost(),名称类型为String,字符串不具有getCost()方法。因此,您的代码在这里失败了。

String name = object + "_" + one;

在上面的代码中,您要为name字段分配值"object_first"。这意味着,字段nameString的类型,其值为"object_first"。因此,nameObjectMethod类没有任何关系,因此name.getCost()毫无意义。

基本上,你要完成的是什么

  

&#34;我想通过使用生成的字符串&#34;

来调用对象
除非您使用reflection,否则无法

答案 4 :(得分:0)

java是 Strong typed language 这意味着你必须定义一个变量,并在使用它之前指定变量类型并且(强调我的) 某些操作可能只允许该类型*

只是因为你这样做:

String objectName;
Object comboValue  = departingStop.getSelectedItem();
Object combo2Value = finalStop.getSelectedItem();
objectName = comboValue + "_" + combo2Value;

dos并不意味着现在objectName从string变为ComboBox ...

想象一下这可能有多糟糕:

Car tata = new Car();
Robot kuka = new Robot();
String foo = tata.getName() + kuka.getName();

现在foo是什么?变压器?没有, 仍然是一个字符串...... 因为这是一个你不能做的字符串 foo.drive(),因为不是汽车,也不是foo.weld();因为不是机器人