在 java 中的方法中在运行时初始化对象的最佳做法是什么?

What is a best practice to initialize an object at runtime in a method in java?

我有一个java方法:

public void method(JSONObject jsonRequest, String token, int size) {
    DataRequest request = new DataRequest(size);
    request.from(jsonRequest);

    if (StringUtils.isNotEmpty(token)) {
        request.setPageToken(token);
    }

    request.doSomething();
}

我想在运行时决定是使用 DataRequest 还是 sub-class of DataRequest。一种方法如下:

public void method(JSONObject jsonRequest, String token, int size) {
    DataRequest request = buildDataRequest(jsonRequest, token, size);
    request.from(jsonRequest);

    if (StringUtils.isNotEmpty(token)) {
        request.setPageToken(token);
    }

    request.doSomething();
}

protected DataRequest buildDataRequest(JSONObject jsonRequest, String token, int size) {
    return new DataRequest(size);
}

将创建 DataRequest 对象的逻辑提取到另一个方法中,让子 classes 覆盖它。

是否有更好的做法来实现这一目标?

您可以创建一个功能性的 interface 创建实例(由于您的参数列表,您不能使用 Supplier(Bi)Function):

@FunctionalInterface
interface DataRequestFactory {
    DataRequest buildDataRequest(JSONObject jsonRequest, String token, int size);
}

您的 class 提供了两个构造函数(也许不需要默认工厂):

public MyClass() {
    this((r, t, s) -> new DataRequest(s));
}

public MyClass(DataRequestFactory factory) {
    this.factory = factory;
}

现在您可以调用 this.factory.buildDataRequest(JSONObject jsonRequest, String token, int size)