Очевидный ответ - использовать HashMap
(или LinkedHashMap
, если вы заботитесь о порядке полей). Затем вы можете добавить динамические поля с помощью get(String name)
и set(String name, Object value)
метода.
Этот код может быть реализован в общем базовом классе. Поскольку существует всего несколько методов, также легко использовать делегирование, если вам нужно расширить что-то еще.
Чтобы избежать проблемы приведения, вы можете использовать типобезопасную карту объектов :
TypedMap map = new TypedMap();
String expected = "Hallo";
map.set( KEY1, expected );
String value = map.get( KEY1 ); // Look Ma, no cast!
assertEquals( expected, value );
List<String> list = new ArrayList<String> ();
map.set( KEY2, list );
List<String> valueList = map.get( KEY2 ); // Even with generics
assertEquals( list, valueList );
Хитрость здесь в том, что ключ содержит информацию о типе:
TypedMapKey<String> KEY1 = new TypedMapKey<String>( "key1" );
TypedMapKey<List<String>> KEY2 = new TypedMapKey<List<String>>( "key2" );
Спектакль будет в порядке.
Повторное использование поля осуществляется с использованием того же типа значения или путем расширения класса ключей карты типов безопасных объектов с дополнительными функциями.
Вычисляемые поля могут быть реализованы со второй картой, которая хранит Future
экземпляров, которые выполняют вычисления.
Поскольку все манипуляции выполняются всего двумя (или, по крайней мере, несколькими) методами, отправка сигналов проста и может быть выполнена любым удобным вам способом.
Чтобы реализовать автоматическую обработку родительских / дочерних элементов, установите прослушиватель сигнала для сигнала «set parent» дочернего элемента, а затем добавьте дочерний элемент к новому родительскому элементу (и при необходимости удалите его из старого).
Поскольку никакой фреймворк не используется и никаких хитростей не требуется, полученный код должен быть довольно чистым и простым для понимания. Отсутствие использования String в качестве ключей дает дополнительное преимущество, заключающееся в том, что люди не засоряют код строковыми литералами.