Java: Установка переменной для переменной класса, где имя класса является строкой? - PullRequest
0 голосов
/ 20 октября 2011

Это мой третий (и, надеюсь, последний) вопрос сегодня.

Можно ли объявить значение переменной в переменной класса, где имя класса является строкой?

Пример

int newalpha;
String color_name = "yellow";
Color red = new Color();
Color yellow = new Color();
Color blue = new Color();
newalpha = color_name.alpha

В этом примере «.alpha» - это переменная, содержащаяся внутри класса Color.Часть, которую я хочу смоделировать, это "newalpha = color_name.alpha", потому что очевидно, что "color_name" - это строка, а не цвет.Это возможно?

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

TL; DR-ответ: нет.

Реальность: да, в некотором роде, с помощью отражения и т.способ достичь того, что вы хотите, например, хранить цвета в хэш-карте с именами цветов в качестве ключей, поэтому вы просто скажете colors.get(colorName).alpha.

Map<String, Color> colors = new HashMap<String, Color>() {{
    put("red", new Color());
    put("yellow", new Color());
    put("blue", new Color());
}};
String colorName = "yellow";
int newalpha = colors.get(colorName).alpha;
0 голосов
/ 20 октября 2011

Как написано в другом месте, ответ на ваш точный вопрос: «Нет».И мое дополнение: «Используйте более выразительный язык, такой как Lisp, Python, Ruby, или такой, как они».

Я подозреваю, что вы задаете не тот вопрос.То, что вы действительно хотите, это способ получить альфа-значение произвольного цвета.Сторонник объектно-ориентированного проектирования использовал бы эту возможность, чтобы наполнить вашу голову фабричными методами, полиморфизмом подтипов, перечисляемыми типами и другими подобными вещами.

Учитывая мои необразованные предположения о вашем уровне кодирования исложность проекта, похоже, что приемлемый обходной путь (если не Правильный путь) намного проще:

int newAlpha = 0;
if(colorName.equals("yellow") newAlpha = yellow.getAlpha();
else if(colorName.equals("red") newAlpha = red.getAlpha();
else if(colorName.equals("blue") newAlpha = blue.getAlpha();
else //raise some kind of exception, assert false, or do something else that seems sensible

(Обратите внимание, что я немного изменил несколько имен в соответствии со стилем Java.)

Я понятия не имею, что происходит в классе Color (или даже как red, yellow и blue отличаются - с текущим кодом они будут одинаковыми (имена локальных переменных не влияют на объект, на который они ссылаются)), но, вероятно, целесообразно разбить последовательность if на отдельный метод.И / или используйте HashMap таким образом:

HashMap<String, Integer> alphaValues = new HashMap<String, Integer>();
alphaValues.put("red", /* something like red.getAlpha() */);
//etc.
// ...
newAlpha = alphaValues.get(colorName);

Я действительно не решал проблему с областью видимости - я уверен, что вы можете разобраться с этим.

Надеюсь, что это поможет!

Редактировать: Дэйв Ньютон опередил меня по поводу хэш-карты - он редактировал свой пост, пока я создавал свой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...