Java 枚举中的泛型类型&;构建器模式

Java 枚举中的泛型类型&;构建器模式,java,generics,type-erasure,Java,Generics,Type Erasure,我正在尝试创建一个生成器模式,它使用泛型对一些方法提供类型检查。目前我有以下工作: ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build(); ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build(); ParameterBuilder.start(Boolean.class).setN

我正在尝试创建一个生成器模式,它使用泛型对一些方法提供类型检查。目前我有以下工作:

ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build();
ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build();
ParameterBuilder.start(Boolean.class).setName(bar).setDefaultValue(false).build();
使用代码:

public class ParameterBuilder<T> {
  private String name;
  private T defaultValue;

  public static <T2> ParameterBuilder<T2> start(Class<T2> type) {
    return new ParameterBuilder<T2>();
  }
  // Other methods excluded for example
}
其中,电子邮件和URL是枚举,其中包含默认值的类。但是如果我走这条路,我将如何实例化参数生成器

public static <T2> ParameterBuilder<T2> start(ParameterType paramType) {
  Class<T2> type = paramType.getTypeClass();
  // How do I instantiate my ParameterBuilder with the right type?
}
publicstaticparameterbuilder启动(ParameterType paramType){
Class type=paramType.getTypeClass();
//如何用正确的类型实例化ParameterBuilder?
}

如果无法使用枚举(我可以看到这种情况),是否有人对其他解决方案有建议?

我不确定您希望使用此解决方案的上下文,但我认为以下可能是一种选择

您可以遵循打开/关闭原则,创建一个接口
参数
,每个类型有一个实现。这样做的好处是,您不需要为所需的每个新参数添加新的枚举值。您可以稍后将类传递给
ParameterBuilder
而不是enum,
ParameterBuilder
Parameter
将共同构建您需要的内容

因此
ParameterBuilder.start()
可以返回特定
参数的实例
,根据参数的类型,该参数可能有不同的方法


我认为这个答案不是很好,但希望能给你一个提示,告诉你如何为你的上下文构建一个潜在的解决方案。

你可以为这些电子邮件和Url类型创建一个对象层次结构

public class DefaultType {
    protected String name;
    protected String defaultValue;
    //some constructor
}

public class EmailType extends DefaultType {
    ...
}

public class URLType extends DefaultType {
    ...
}
然后,参数生成器可以如下所示:

public static ParameterBuilder start(DefaultType type) {
    ParameterBuilder builder = new ParameterBuilder(type);
    builder.setType(type);
    return builder;
}
ParameterBuilder.start(new EmailType("name","value");...
那么你可以这样称呼它:

public static ParameterBuilder start(DefaultType type) {
    ParameterBuilder builder = new ParameterBuilder(type);
    builder.setType(type);
    return builder;
}
ParameterBuilder.start(new EmailType("name","value");...

这是否有帮助?您是否希望朝这个方向发展?

我认为您需要为每个类类型提供一个枚举(我不知道如何让一个枚举覆盖多个类型并保持工作状态)。在这种情况下,一个通用的通用接口可以实现您想要的功能。然后,如果有帮助,您可以创建某种工厂来提供枚举常量

这包括:

static interface ParameterType<T> {}

static enum ParameterTypeEnum implements ParameterType<String> { EMAIL; }

public static void main(String[] args) {
    ParameterBuilder
           .start(ParameterTypeEnum.EMAIL)
           .setName("email")
           .setDefaultValue("foo@bar.com")
           .build();
}

public static class ParameterBuilder<T> {

    private String name;
    private T defaultValue;

    public static <T2> ParameterBuilder<T2> start(ParameterType<T2> paramType) {
        return new ParameterBuilder<T2>();
    }

    ParameterBuilder<T> setName(String name) {
        this.name = name;
        return this;
    }

    ParameterBuilder<T> setDefaultValue(T defaultValue) {
        this.defaultValue = defaultValue;
        return this;
    }

    void build() {}
}
静态接口参数类型{}
静态枚举参数类型枚举实现参数类型{EMAIL;}
公共静态void main(字符串[]args){
参数生成器
.start(参数typeenum.EMAIL)
.setName(“电子邮件”)
.setDefaultValue(“foo@bar.com")
.build();
}
公共静态类参数生成器{
私有字符串名称;
私人T值;
公共静态ParameterBuilder启动(ParameterType paramType){
返回新的参数生成器();
}
ParameterBuilder setName(字符串名称){
this.name=名称;
归还这个;
}
参数生成器setDefaultValue(T defaultValue){
this.defaultValue=defaultValue;
归还这个;
}
void build(){}
}

你能告诉我什么是
电子邮件
网址
。它们是两个不同的枚举吗?它们是两个枚举的实例吗?它们是什么?在我的例子中,我有一个ParameterType回音类似:
public enum ParameterType{STRING(STRING.class,“STRING”)、INTEGER(INTEGER.class,“INTEGER”)、MULTILINE(STRING.class,“Multine Text”)、HTML(STRING.class,“HTML”)、DATE(DATE.class,“DATE”)、BOOLEAN(BOOLEAN.class,“BOOLEAN”);//遵循的方法
这听起来是一种明智的方法。这样我就可以使用StringParameterEnum、IntegerParameterEnum等,这样代码仍然很干净。谢谢