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

(Также приветствуются любые другие предложения по решению описанной проблемы дизайна)

Благодарность

3
Sam Palmer 15 Апр 2016 в 13:14

2 ответа

Лучший ответ

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

За исключением последнего, есть множество веских причин рассматривать размышления как решение.

9
Kayaman 15 Апр 2016 в 10:47

Лично мне грустно размышлять, и, по моему опыту, почти всегда есть лучший способ. В описанной вами проблеме, устанавливая переменные на основе строки, я бы подумал о том, чтобы пойти с вашей идеей хэш-карты, которая будет ссылаться на переменные через строковый ключ, который кажется именно тем, что вы описываете. Если вам нужна возможность ссылаться на значения, которые не существуют, вы также можете включить фабричные методы для создания переменных, когда ключ не существует, а затем добавить их на карту, если вы обертываете объекты, они будут переданы по ссылке, чтобы избежать проблемы, которую вы описать, но это зависит от реализации (например, использование класса Integer и т. д. для автоматического бокса, если вы ссылаетесь на примитивы) Вместе это позволило бы получить гораздо более жесткую и четко определенную реализацию, а не отражать значения здесь, там и везде. Приносим извинения за предубеждение против отражения! Надеюсь это поможет.

0
david savage 7 Июн 2019 в 08:44