Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以从生成器获得匿名类吗?_Java_Builder Pattern - Fatal编程技术网

Java 我可以从生成器获得匿名类吗?

Java 我可以从生成器获得匿名类吗?,java,builder-pattern,Java,Builder Pattern,我知道我可以在手动创建匿名类的实例时创建匿名类,如下所示: ClassName c = new ClassName() { public void overridenMethod() { method body } } 但是,有些类使用生成器模式创建新实例。我的问题是,是否有一个技巧允许我使用其超类提供的生成器创建匿名类。否,或者至少不直接创建:在Java中,不能从实例继承;您需要从类继承 但是,您可以构建一个匿名类,该类包装从生成器返回的实例。您可以根据需要调用包装实例上的方法,同时

我知道我可以在手动创建匿名类的实例时创建匿名类,如下所示:

ClassName c = new ClassName() {
    public void overridenMethod() { method body }
}

但是,有些类使用生成器模式创建新实例。我的问题是,是否有一个技巧允许我使用其超类提供的生成器创建匿名类。

否,或者至少不直接创建:在Java中,不能从实例继承;您需要从类继承

但是,您可以构建一个匿名类,该类包装从生成器返回的实例。您可以根据需要调用包装实例上的方法,同时覆盖需要覆盖的方法

final ClassName wrapped = builder.buildClassName();
ClassName c = new ClassName() {
    public void passedThroughMethod1() { wrapped.passedThroughMethod1() }
    public void overridenMethod() { method body }
    public void passedThroughMethod2() { wrapped.passedThroughMethod2() }
};

此时,
c
的行为与
wrapped
实例类似,除了
覆盖方法
。一个不幸的结果是,您无法访问
包装的

的受保护成员。如果我没有弄错,您希望构建器返回匿名类型的实例。如果是这种情况,我将在基类中添加一个
create
方法,构建器将调用该方法来创建新实例。在中,派生类重写
create
,以返回匿名类的实例。这假设构建器可以访问基类的实例。另一种机制是向建筑商提供
供应商


也许我误解了这个问题,但您可以返回匿名类的实例,只要该非类实现/扩展了指定为
ResultType builder.build()返回类型的类型。
。我不确定是否理解您的意思。你建议我修改生成器吗?我不能。我在寻找类似于上面代码片段的东西。比如
builder.build(){overrideMethod(){methodbody}
。我认为构建器模式可能是标准构造函数的完全替代品,但显然不是这样。啊,现在明白了。在这种情况下,dasblinkenlight的答案是正确的。