2017-02-02 6 views
2

私はコマンドを含むStringを持っていて、それを読んで、それが何をするかをプリフォームしたいのですが。Stringから引数を取って関数を呼び出す方法は?

例:

private void move(float position, float speed){ 
..... 
} 

と "MOVE" はmove()関数を呼び出し、「305」はString

String command = "MOVE 305 5" 

私は機能を持っている場合"5"が速度です。

だから、それはこのようにする必要があります:

move(305, 5); 

私はこの文字列を使用して関数を呼び出すことができますどのように?

+0

あなたのすべての文字列が 'COMMAND ARG1 ARG2 argN'の形式を次する場合、なぜ['文字列#を使用していませんSplit'](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String))? – px06

+0

Javaで「リフレクション」について学ぶ必要があります。リフレクションでは、文字列を入力として使用して既存のメソッドを呼び出すことができます。 – IQV

+1

@IQVここでリフレクションは必要ありません。経験から、可能なら避けるべきです。 – Fildor

答えて

5

すべてのコマンドが同じ形式であれば、可能性のあるコマンドを切り替えるswitch文が必要です。こうすることで、文字列からの引数を必要とするときに各関数を呼び出すことができます。

例:

String[] parts = command.split(' '); 
switch(parts[0]) 
{ 
    case "MOVE": 
     float position = Float.parseFloat(parts[1]) 
     float speed = Float.parseFloat(parts[2]) 
     move(position, speed); 
     break; 

    case ... : 

    ... 

    default: 
     System.out.println("Unknown command"); 
     break; 

} 
3

既に他の回答で示されるように、スイッチケースとともに、異なる可能なコマンドの列挙を使用してもよいです。

列挙:

public enum CommandType{ 

     MOVE, STOP; 
} 

とサンプルの使用量:

String[] splitted = command.split("\\s"); 

CommandType currentCommand = CommandType.valueOf(splitted[0]); 


switch(currentCommand){ 

    case MOVE : 
     move(Float.parseFloat(splitted[1]),Float.parseFloat(splitted[2])); 
     break; 
    case STOP : 
     stop(); 
     break; 
    default : 
     break; 
} 
関連する問題