2013-10-15 4 views
0

У меня есть класс с соединением булевы и целых:Java: Как ссылаться на класс вар на основе ввода # 2

class Soup { 
    boolean mItem1 = false 
    boolean mItem2 = false 
    int  mItem3 = 10 
    boolean mItem4 = false 
    int  mItem5 = 100 
{ 

У меня также есть метод «аннулируются addIngredient (String ITEMNAME)», что I будет передавать строковое значение, например «Item1» или «Item4».

void addIngredient(String itemName) { 
    // I need help with the following line 
    Soup.m(itemName) = true 
} 

Как я могу установить значение переменной Soup.mItem1, например, без использования, если оператор или переключатель. Например, я мог бы добавить до 25 или 50 переменных «mItems», которые могут быть либо логическими, либо целыми.

В основном я хочу взять Soup.m и конкатенировать строку, которую я передаю (например, Item1), чтобы сделать строку «Soup.mItem1», а затем установить значение, например «Soup.mItem1 = true» или «Soup .nItem3 = 1000 ".

+0

Просьба уточнить ваш вопрос немного больше. Что такое 'Soup.m (...)'? И что вы имеете в виду, когда говорите - * 25 или 50 «Элементы», которые могут быть либо Int, либо Bool *? –

+0

Я обновил свой вопрос, спасибо. – Selzier

+0

Хорошо. Вы не можете сделать это на Java. Вы хотите, чтобы ArrayList или HashMap хранили различные значения.Сохраните 'ArrayList ' и 'ArrayList ' и добавьте к нему значения. –

ответ

0

Посмотрите на это другое сообщение, в котором рассказывается о том, как превратить строку, переданную в качестве параметра или переменной, и назначить ей поле. Я думаю, что это будет работать, но я до сих пор сделать некоторые дополнительные исследования: Creating a variable name using a String value и Get variable by name from a String

Это то, что я придумал:

final Map<String, boolean> itemType = new HashMap<>(); 

void addIngredient(String itemName) { 
itemName="m" + itemName; 
itemType.put(itemName, true); 
} 

Думаю, что это должно работать.

0

Вы хотите использовать reflection.

import java.lang.reflect.Field; 

public class Main 
{ 
    private boolean mItem1; 
    private int mItem2; 

    public static void main(String[] args) 
     throws NoSuchFieldException, 
       IllegalArgumentException, 
       IllegalAccessException 
    { 
     final Main instance; 

     instance = new Main(); 
     instance.addIngredient("Item1"); 
     instance.setIngredientAmount("Item2", 1000); 

     System.out.println(instance.mItem1); 
     System.out.println(instance.mItem2); 
    } 

    public void addIngredient(final String itemName) 
     throws NoSuchFieldException, 
       IllegalArgumentException, 
       IllegalAccessException 
    { 
     final Class<Main> clazz; 
     final Field  item; 

     clazz = Main.class; 
     item = clazz.getDeclaredField("m" + itemName); 
     item.set(this, true); 
    } 

    public void setIngredientAmount(final String itemName, 
            final int value) 
     throws NoSuchFieldException, 
       IllegalArgumentException, 
       IllegalAccessException 
    { 
     final Class<Main> clazz; 
     final Field  item; 

     clazz = Main.class; 
     item = clazz.getDeclaredField("m" + itemName); 
     item.set(this, value); 
    } 
} 

Я бы на самом деле не рекомендовал этого, но он должен удовлетворять вашим требованиям.

0

Вы можете сделать это с помощью Reflection, но Reflection имеет много предостережений, включая производительность и очень плотную связь кода. Поэтому я бы рекомендовал не использовать Reflection, но если вам нужно, вы можете сделать это так.

OriginalClass

public class OriginalClass { 
    public int var1; 
    public String var2; 
    public boolean var3; 
} 

Главная

import java.lang.reflect.Field; 
public class Main { 
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 
     OriginalClass orig = new OriginalClass(); 
     orig.var1 = 1; 
     orig.var2 = "Hello"; 
     orig.var3 = true; 
     for(int i = 0; i <= 3; i++) { 
      Field origVar = OriginalClass.class.getDeclaredField("var" + i); 
      System.out.println(origVar.get(orig)); 
     } 
    } 
} 

В качестве альтернативы, вы можете использовать getFields и затем цикл по всем полям.

for(Field origVar : orig.getFields()) 
    System.out.println(origVar.get(orig)); 

Подобно методу get(), есть set() метод на Field. Подпись

void set(Object obj, Object value); 

Примечание: Как правило, из-за капсулирования, ваши переменные члены будут скрыты, так что вы должны получить доступ к ним через их добытчиками и сеттеров, что-то вроде этого.

Method m = OriginalClass.class.getDeclaredMethod("getVar1", null); 
System.out.println(m.invoke(orig)); 
m = OriginalClass.class.getDeclaredMethod("setVar1", Integer.TYPE); 
m.invoke(orig, 3); 
System.out.println(orig.var1); //Will print 3 
Смежные вопросы