2017-05-05 15 views
-1

生成された文字列を使用してオブジェクトを呼び出したいとします。Java:生成された文字列を使用してオブジェクトを呼び出す

ご覧のとおり、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; 
    } 
} 
+0

私はあなたが達成しようとしていることを言う必要があると思います。別のやり方でやるべきことをしようとしているかのように見えます。 タスクが何であるかを言うなら、我々は助けることができるかもしれません – Richard

+1

[this](http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-あなたは何を探しているのですか? – Oswald

+0

私は過去にあり、人々は私の質問を短縮して絞り込むようにと言ってきました。基本的に、私は2つのコンボボックスaとbを持っています。両方のコンボボックスには1と2が含まれています。私は2つのオブジェクトを作成しました。 1_2と2_1。コンボボックスで選択された値に基づいて、特定のオブジェクトを参照するようにしようとしています。私の解決策は、コンボボックスの値を_で結合したオブジェクトを作成することでした。次に、コンボボックスの選択値の値に基づいてこれらのオブジェクトを参照できます。私は自分自身を明確にすることができたことを確信しています。 –

答えて

1

あなたは文字列名オブジェクトにgetCost()を呼び出そうとしているので、あなたが、望むようにこれは動作しません。 名前 - は文字列ですが、ObjectMethodクラスのオブジェクトではありません。

2

あなたは理解する必要があります:JavaはRubyやPythonなどの動的言語ではありません。

Stringへの参照を別のものにすることができる魔法の接続はありません。

つまり、 "object_one"を文字列オブジェクトに入れても、はという文字列のようにを処理することができません。

その方向に向かうJavaの特徴の1つはreflectionです。しかし、それは本当に高度なトピックです。それを調べる前に、real Javaの基本を理解する必要があります。だから、より良いスタートhere

私が言っていることは、「スリム」の答えが指摘しているように、ある種の「名前で呼ぶ」機能を実装するためにMapを使うことができます。しかし、ポイントは:それは「あなたがJavaでやる方法ではない」ということです。 Javaは静的にコンパイルされた言語です。そのシステムから抜け出し、実行時にフラット・ストリング・パースに依存するものを実行しようとすると、Javaを使用する意味がありません。

0

はで、タイプ名はgetCost()です。したがって、あなたのコードはここで失敗します。上記のコードで

String name = object + "_" + one; 

、値"object_first"nameフィールドを割り当てます。つまり、フィールドnameは、値"object_first"Stringのタイプです。だから、nameは決してObjectMethodクラスに関連しないので、name.getCost()は意味をなさない。

あなたがreflectionを使用しない限り、基本的に何を

「私は生成された文字列を使用してオブジェクトを呼び出すしたいと思います」

を達成しようとしていることはできません。

2

Reflectionを使用するのが不足していると思います。この質問をしていれば、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可能性があり、あなたはラムダを渡すことができます。

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

は、デザインパターンについての本の中のコマンドと戦略パターンを見てください。

+0

それは良い点です。あなたは私の投票を得ました。私はまだOPがむしろ間違ったウサギの穴に落ちていると思うが。 Javaの静的型付けされた性質を理解する必要があります。動的スクリプト言語のメンタルモデルでJavaを使用しようとするのではなく、しかし、言ったように。あなたはここで私の投票を得ました;-) – GhostCat

+0

@GhostCat Understood。コンボボックスの異なる値に基づいて、それぞれ異なるオブジェクトを呼び出す25個のif文を作成しました。私はもっ​​と良いものを探すだろうが、今のところそれは機能する。ありがとう –

0

Javaは

*あなたが 特定の操作を、変数を定義し、また、あなたがそれを使用する前に、変数の型を指定し、(強調鉱山)しなければならないことを意味するだけで、そのタイプに許容かもしれStrong typed language ですあなたが理由だけ

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

今objectnameはコンボボックスに文字列から変異しdosn't平均...

が、これは可能性がどのように恐ろしい想像:今fooは何

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

のですか?変圧器??いいえ、 はまだ文字列です... それはあなたができない文字列です foo.drive()、車でもfoo.weld()でもないからです。ロボットではないので

関連する問題