如何通过类类型委托构造函数的实例化?

How to delegate instantiation of constructor by classtype?

我有几个 class 扩展 BaseClass。现在我想在一个DelegatorContext中静态定义一个activeclass,并且每个对象的创建都应该基于active上下文

示例:

class BaseClass {
    String firstname, lastname;
}

class FirstClas extends BaseClass {}
class SndClass extends BaseClass {}

class DelegatorContext {
    public static BaseClass activeClass;
}

class Delegator {
    BaseClass create(String firstname, String lastname) {
        return DelegatorContext.activeClass instanceof FirstClass
          ? new FirstClass(firstname, lastname) : new SndClass(firstname, lastname);
    }
}

如果引入更多实体扩展 BaseClass,该示例将获得更多样板文件 BaseClass

有没有更好的模式来解决我的问题?甚至 Java8 和 Functions?还是泛型?

我使用这个结构是为了能够在运行时切换实现...

您可以使用作为 BaseClass 子类的类型参数使 DelegatorContext 成为泛型。

此外,activeClass 不应该是 static 并且应该引入一个额外的 Class<T> 成员来保存关于 activeClassClass 信息。

它将用于实例化正确的子类:

class DelegatorContext<T extends BaseClass> {
    private Class<T> clazz;

    public T activeClass;

    private DelegatorContext(Class<T> clazz) { 
         this.clazz = clazz;
    }

    public T createInstance(String firstname, String secondname) {
        activeClass = clazz.newInstance();
        activeClass.setFirstName(firstname);
        activeClass.setSecondName(secondname);
        return activeClass;
    }

    public static <T extends BaseClass> DelegatorContext<T> of(Class<T> clazz) {
        return new DelegatorContext<T>(clazz);
    }
}

有了这个,你可以做:

<T extends BaseClass> T create(Class<T> clazz, String firstname, String lastname) {
    return DelegatorContext.of(clazz).createInstance(firstname, lastname);
}

据我所知,您最好在此处使用枚举:

enum DelegatorContext {
    First {
        @Override
        BaseClass instantiate(String firstName, String lastName) {
            return new FirstClass(firstName, lastName);
        }
    },
    Second{
        @Override
        BaseClass instantiate(String firstName, String lastName) {
            return new SecondClass(firstName, lastName);
        }
    };

    static Context defaultContext;
    abstract BaseClass instantiate(String firstName, String lastName);
}

我猜,你的意思是这样的:

interface BaseClassFactory {
    BaseClass create(String firstname, String lastname);
}
class DelegatorContext {
    public static BaseClassFactory active;
}

DelegatorContext.active=FirstClass::new;

DelegatorContext.active=SndClass::new;

这就要求所有的subclass都有一个签名相同的构造函数,匹配工厂接口的签名(有趣的给举个例子)

你真的不需要另一个工厂 class 但为了完整起见,它将是:

class Delegator {
    BaseClass create(String firstname, String lastname) {
        return DelegatorContext.active.create(firstname, lastname);
    }
}