экземпляр init во время выполнения - PullRequest
0 голосов
/ 05 апреля 2019

Я использую Factory Pattern , чтобы инициировать новый экземпляр во время выполнения.

Вопросы: Какая версия самая быстрая? Есть ли лучшие образцы или решения с Java 12?

/**
 * VERSION 1:
 * 
 * Uses Reflection with clazz
 * 
 * @param <T>
 * @param colorClass
 * @return instance type of derived colorClass
 */
public <T extends Color> T createInstance(Class<T> colorClass) {

    T t = null;
    try {
        t = colorClass.getConstructor().newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return t;
}


/**
 * VERSION 2:
 * 
 * Uses Reflection with canonical name of class
 * 
 * @param <T>
 * @param colorClass
 * @return instance type of derived colorClass
 */
public <T extends Color> T createInstance(String colorClassName) {


    T red = null;
    try {
        red = (Color) Class.forName(colorClassName).getConstructor().newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return red;
}


/**
 * VERSION 3: (abstract factory pattern?)
 * 
 * Uses switch without reflection
 * 
 * @param <T>
 * @param colorClass
 * @return instance type of derived colorClass
 */
public <T extends Color> T createInstance(ColorName colorName) {

    T t = null;
    switch (colorName) {
    case red:
        return new Red();
        break;
    case green:
        return new Green();
        break;
    case blue:
        return new Blue();
        break;
    case black:
        return new Black();
        break;
    default:
        break;
    }

    return t;
}

Как и предполагалось, я включил версию 4 (которая кажется лучшим решением!):

public enum ColorName {
    Red(ColorRed.class),
    Green(ColorGreen.class),
    Blue(ColorBlue.class),
    Black(ColorBlack.class);


    ColorName(Class<?> clazz) {
        this.clazz = clazz;
    }

    private final Class<?> clazz;

    public Class<?> getClazz() {
        return clazz;
    }

    public Color createColor() {

        Color c = null;

        try {
            c = (Color) this.clazz.getConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return c;
    }
}
...