2015-09-16 4 views
1

Есть ли способ в Java (Android) связать строку и функцию? Моя цель - запустить определенную функцию в зависимости от того, какая строка получена из отдельного метода.Связывание строки с функцией

ie, если myString == "building", то выполните buildmethod();

Я думал об использовании HashMap, как так:

HashMap<String,Runnable> hashDBTableUpdateRef = new HashMap<>(); 
hashDBTableUpdateRef.put("house",this.housemethod()); 
hashDBTableUpdateRef.put("shed",this.shedmethod()); 
hashDBTableUpdateRef.put("barn",this.barnmethod()); 

затем

String myString = getCalculatedString(); 
for (String s : hashDBTableUpdateRef) { 
    hashDBTableUpdateRed.get(s).run(); 
} 

Я не могу сделать обобщенный метод с параметром, например, function anyBuilding(String buildingType) в результате следующих действий и пользовательские перечисления. Есть предположения? Есть runnable путь вперед?

например:

function housemethod() { 
    myHouseObject.runSomething(); 
} 
function shedmethod() { 
    myShedObject.runSomething(); 
} 
function barnmethod() { 
    myBarnObject.runSomething(); 
} 

Спасибо,

+2

Я чувствую запах дизайна здесь –

+0

Вы вполне можете быть правы – Jammo

+0

Пожалуйста, укажите больше контекста, например. откуда эта строка? – Thomas

ответ

5

можно, например, определить перечисление, который реализует Command интерфейс

interface Command { 
     void execute(); 
    } 

    enum MyEnum implements Command { 
     A() { 
      public void execute() { 
       System.out.println("A"); 
      } 
     }, 
     B { 
      public void execute() { 
       System.out.println("B"); 
      } 
     }; 
    } 

теперь все, что вам нужно преобразовать строку в ENUM MyEnum.valueOf("someString"); и вам возвращенный объект, вы можете вызвать метод execute.

Но все же главный вопрос остается, почему вы хотите сделать это и чего хотите достичь? потому что это может быть лучше.

+0

Это прекрасно, спасибо, обработано. 'mapDbUpdater = new HashMap (); mapDbUpdater.положим ("пролить", новый Command() { @Override общественного недействительными йоЗотеЬЫпд() { shed.refreshDbContents();} }); ' – Jammo

+0

Затем я использую' попробовать {Command updaterCommand = mapDbUpdater.get (tableNameToUpdate); updaterCommand.doSomething(); ' – Jammo

+1

@Jammo - Динамическое переопределение метода совершенно не нужно. Используйте 'MyEnum.valueOf (« shed »). Execute()'. – OldCurmudgeon

0

Вы совсем рядом, чтобы получить то, что вы хотите, но вы должны заменить родовую Runnable специфического интерфейсом:

public interface MyInterface 
{ 
    public <return-type> doSomething(<parameters>) throws <exceptions>; 
} 

Это является семантического способа улучшить свой первоначальный дизайн, потому что вы можете name ваши методы, добавьте параметры и исключения, добавьте больше методов и т. д.

Остальная часть вашего проекта (конкретная реализация для каждого необходимого поведения и хранения всех их на карте) в порядке.

+0

Может быть. Вероятно. С другой стороны, также может быть, что «Runnable» фактически фиксирует как конкретное представление целевых задач, как есть, и в этом случае создание другого типа для представления одного и того же объекта было бы более вредным, чем полезным. –

+0

@ Джон Боллинджер Корс, это зависит от дебюта разработчика. Я просто хотел, чтобы он/она не чувствовал себя ограниченным «Runnable». –

Смежные вопросы