2017-02-02 2 views
2

Если у меня есть String, который содержит команду, и я хочу, чтобы программа прочитала ее и заработала то, что она говорит.Как вызвать функцию с аргументами из строки?

пример:

Если у меня есть функция:

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

и String

String command = "MOVE 305 5" 

где "MOVE" вызывает move() функцию и «305» является и «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; 
} 
Смежные вопросы