Общая конфигурация неизвестных подтипов с различными установщиками геттеров

1

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

  • Я думаю, что следующий подход будет работать, но насколько он хорош/какие проблемы могут возникнуть?
  • Или есть ли более эффективные подходы/или даже установленные шаблоны проектирования для этой проблемы?

Суперкласс для обеспечения общей конфигурации

public abstract class ParametrizerBase<P1, P2> {
    public P1 Param1;
    public P2 Param2;
}

Некоторый конкретный класс с конкретными параметрами, которые ему нужны

public class SomeConcreteClass extends ParametrizerBase<Boolean, String> {
    public SomeConcreteClass(Boolean enabled, String task){
        Param1 = enabled;
        Param2 = task;
    }
    // ... does something with the parameter data
}

Другой конкретный класс с различными типами данных

public class AnotherConcreteClass extends ParametrizerBase<Integer, Date> {
    public AnotherConcreteClass(Integer numberOfItems, Date when){
        Param1 = numberOfItems;
        Param2 = when;
    }
    // ... does something with the data it holds
}

Пример использования

    ArrayList<ParametrizerBase> list;

    public void initSomewhere() {
        SomeConcreteClass some = new SomeConcreteClass(true,"Smth");
        AnotherConcreteClass another = new AnotherConcreteClass(5, new Date());
        list = new ArrayList<ParametrizerBase>();
        list.add(some);
        list.add(another);
    }

    public void provideDataElsewhere() {
        for (ParametrizerBase concrete : list) {
            String param1Type = concrete.Param1.getClass().getName();
            if (param1Type.contains("Boolean")) {
                 Boolean value = concrete.Param1;
                 // Now could let user modify this Boolean with a checkbox 
                 // and if they do modify, then write it to concrete.Param1 = ...
                 // All without knowing what Param1 is (generic configuration)
            } else if (param1Type.contains("Integer")) {
                 Integer value = concrete.Param1;
                 // ...
            } // ...
            // Same for Param2 ...
        }
    }
  • 1
    попробуйте instanceof, вместо того, чтобы извлекать строку имени класса, а затем сравнивать. (Кстати, следите за подклассами, используя этот совет)
Теги:
generics
design-patterns
data-binding

1 ответ

1
Лучший ответ

Используйте интерфейс Java для описания геттеров и сеттеров. Пусть все конкретные классы реализуют этот интерфейс. Поместите объекты в тип интерфейса и вызовите геттеры и сеттеры по мере необходимости.

  • 0
    1) Я не уверен, что правильно понимаю, в частности, первое предложение - будет «описывать», что означает, что интерфейс имеет Boolean getBoolean (), getInteger () и т.д. Но учитывая, что конкретные классы имеют только подмножество различных методов получения и установки, тогда каждый конкретный класс должен будет содержать нулевые реализации множества типов, которые он фактически не использует? (если я вас правильно понял)
  • 0
    2) Я понимаю, что не упомянул о важном дополнительном требовании, которое заключается в том, что мне нужно, чтобы конкретные подклассы брали на себя как можно меньшую ответственность за включение этой общей конфигурации - в идеале они на самом деле не будут делать ничего большего, чем просто указание необходимых параметров. Это особенно важно, поскольку я предоставляю библиотеку, поэтому я не буду той, которая реализует конкретные классы. Ваше решение, насколько я понимаю, к сожалению, требует дополнительного стандартного кода во всех конкретных классах :(
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню