Я согласен с использованием общего базового класса, когда это возможно, но вы не всегда можете добавить метод в базовый класс для каждого использования, которое может потребовать выбора между различными подклассами.
Ваше решение "карта" является достойным подходом для случаев, когда логика выбора специфична для фрагмента кода, например, для сопоставления действий пользователя с объектом (например, всплывающего окна), и вы не можете найти способ использовать общее базовый класс.
Один недостаток - инициализация всех всплывающих окон. но это требуется только когда valueChange
Вы должны отложить создание экземпляра до тех пор, пока оно вам не понадобится:
interface Showable {
void show();
}
map() {
map.put("p1", new Showable() { void show() { new Popup1().show(); } } );
map.put("p2", new Showable() { void show() { new Popup2().show(); } } );
map.put("p3", new Showable() { void show() { new Popup3().show(); } } );
}
onValueChange() {
map.get(selectedItem).show();
}
Анонимные классы не имеют состояния, поэтому, если вы хотите быть более эффективными, вы можете создать анонимные экземпляры один раз и использовать их повторно.