Java: фабричный метод с отражением? - PullRequest
2 голосов
/ 26 августа 2011

У моего фабричного класса есть коллекция классов, я не хочу, чтобы эта зависимость, когда я добавляю подкласс SuperClass, мне нужно, чтобы фабричный файл оставался неизменным

редактирование: Мой фабричный класс должен возвращать все экземпляры подклассов суперкласса, но у меня не может быть их коллекций (или их имен), потому что это означает, что мне придется менять файл фабрики всякий раз, когда я добавляю новый подкласс!

package reflection;

public final class Factory {

    private final SuperClass[] subclasses_collection 
            = {new SubClass1(), new SubClass2() /* ...SubClassN */};

    public final SuperClass[] getAllSubClasses() {
        return subclasses_collection;
    }
}

Ответы [ 3 ]

0 голосов
/ 26 августа 2011

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

0 голосов
/ 26 августа 2011

Если вы хотите искать все подклассы класса, вы можете использовать рефлексию, как говорит Джеффри.Однако вместо того, чтобы писать код, чтобы сделать это самостоятельно, или копировать и вставлять его из некоторой случайной статьи, я бы использовал ResolverUtil из веб-фреймворка Stripes , который делает именно то, чтоВы хотите (и больше!).

Альтернативой сканированию пути к классам может быть создание реестра во время выполнения.Вы можете создать базовый класс следующим образом:

public abstract class SuperClass {
    private static final Set<Class<? extends SuperClass>> SUB_CLASSES = new HashSet<Class<? extends SuperClass>>();

    /* instance initializer */ {
        SUB_CLASSES.put(getClass());
    }
}

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

0 голосов
/ 26 августа 2011

вместо

new SubClass1()

сделать что-то вроде этого

Class clazz = Class.forName("SubClass1");
Object subclass1 = clazz.newInstance();

если вы хотите передать аргументы конструктору, обратитесь к этой статье, раздел Создание новых объектов http://java.sun.com/developer/technicalArticles/ALT/Reflection/

...