Java 1.4 + шаблон расширяемого компоновщика - PullRequest
0 голосов
/ 14 июня 2011

Я натолкнулся на небольшую кирпичную стену, когда речь заходит о реализации расширяемого класса, который использует шаблон builder в java 1.4. Сам шаблон работает, но я натолкнулся на кирпичную стену, когда речь заходит о том, чтобы сделать его расширяемым из-за отсутствия шаблонов.

На данный момент лучшее решение, которое мне удалось найти, - это иметь абстрактный внутренний класс Builder внутри родительского элемента. Затем он содержит защищенный конструктор для всех необходимых параметров, общих для дочерних классов, и некоторый Javadoc, чтобы сообщить пользователю, что ему нужно реализовать свой собственный метод build(), который возвращает объект того же типа, что и возвращаемый класс. Это работает, если люди RTFM, в противном случае он ломается ... что плохо. Любые идеи приветствуются.

примечание: я застрял, работая в версии 1.4, так как это виртуальная машина специального оборудования, на которой она рассчитана.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Один из способов «подделать» дженерики - это передать подклассу Class в конструктор.

public class MySuperClass {

    private final Class clazz;

    protected MySuperClass(Class clazz) {
        this.clazz = clazz;
    }

    public void doSomethingGenericish(Object param) {
        // Pseudo generic check
        if (!param.getClass().isAssignableFrom(param)) {
            throw new ClassCastException("Could not cast " + param.getClass() + " as " + clazz);
        }
        // Some code
    }
}

public class MySubClass extends MySuperClass {

    protected MySubClass()
    {
        super(PseudoGenericsParameterClass.class);
    }
}
0 голосов
/ 15 июня 2011

Обобщение - это просто удобство, которое позволяет компилятору навязывать вам некоторые вещи. Если вы просто тщательно документируете типы вещей и сами применяете эти правила, вы получите тот же результат без обобщений. Черт возьми, вы можете даже написать материал общего типа в комментариях и следить за ними самостоятельно.

...