builder—如何在java中编写一个重写方法来返回调用类的状态

6gpjuf90  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(437)

我对java和设计模式比较陌生。我正在尝试为我的应用程序实现生成器模式。我有一个 interface 它有一个方法 build 这个 build 方法将类作为参数并返回相同的值。

public interface TestInterface {
    public TestInterface withTest(int start);
    public <T> T build();
}

到目前为止,我已经实现了这一点 interface 在单个类中重写 GenerateBuilder 上课,效果很好

public class GenerateNumbers {

private String start;

private GenerateGSRN(GenerateBuilder builder) {
        this.start = builder.start;
    }

    public static class GenerateBuilder implements TestInterface {

        private String start;

        @Override
        public TestInterface withGcp(String start) {
            this.start = start;
            return this;
        }

        @Override
        public GenerateNumbers build() {
            return new GenerateNumbers(this);
        }

    }
}

但我想移动 GenerateBuilder 类,该类将方法重写为自己的独立类,以便其他任何类都可以使用它(使其成为公共类,这样我就不必再编写此代码)。
但是我们可以看到
GenerateBuilder Build 功能与 GenerateNumbers 因此我无法移动它。我想换衣服 Build 中的方法 Interface 以及在 overriding 以便它将类的示例返回给调用类。
例如:如果 GenerateNumbers 正在调用生成方法 build 方法应返回 GenerateNumbers . 如果 GenerateNumbersRandom 他在打电话吗 build 方法应返回的示例 GenerateNumbersRandom .
我尝试了几件事,但都没有成功:
接口中: public <T> T build(Class clazz); 在覆盖中:

@Override
        public <T> T build(Class clazz) {
            return clazz.newInstance();
        }

我希望我能正确地解释这个问题。有人能告诉我怎么做吗。

bybem2ql

bybem2ql1#

据我所知,你可以:
声明接口具有泛型类型( Builder )
声明要由实现接口的类生成的类型( NumberGenerator )
将生成器声明为接口的实现,接口的泛型类型为它将生成的类( NumberGeneratorBuilder implements Builder<NumberGenerator> )
Builder 接口,在运行时访问泛型的实际类型以示例化此类型的新示例。
举个例子,这会给出如下结果:

import java.lang.reflect.ParameterizedType;

public interface Builder<T> {

  default T build() throws IllegalAccessException, InstantiationException {
    // in a more production-ready application, you would not reference item with their index but lookup through correct criterion to avoid getting a bad class instantiated
    return ((Class<T>) ((ParameterizedType) this.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0]).newInstance();
  }
}
public class NumberGenerator {

  public static NumberGenerator instance() throws InstantiationException, IllegalAccessException {
    return new NumberGeneratorBuilder().build();
  }

  // Note that visibility is important here, default constructor needs to be visible from the Builder class, and not from its implementation
  NumberGenerator() {

  }

  public static class NumberGeneratorBuilder implements Builder<NumberGenerator> {

  }

}

相关问题