在 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)
。
我有一个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)
。