设计 - 在执行每个方法之前检查条件

use*_*124 7 java oop design-patterns

我有一个名为Document.java的POJO,包含100多个成员变量.有一个转换层,我获取所需的数据,转换它并将其存储在Document类中.

在转换层中,我想仅在满足特定条件(基于可用上下文)时才设置成员变量.

所以它看起来像这样:

if(shouldGetExecuted1(context.getXXX())){
  document.setField1(tranformDataForField1(availableData1));
}

if(shouldGetExecuted2(context.getXXX())){
  document.setField2(tranformDataForField2(availableData2));
}
Run Code Online (Sandbox Code Playgroud)

我想为所有100多个领域做到这一点.有干净的方法吗?

附加信息

我不想在这里使用策略,因为它会创建太多的类,因为策略的增长.

Aki*_*ira 0

不,在 Java 中没有干净的方法可以做到这一点。您可以使用反射找到方法,但无法找到诸如“availableDataN”之类的变量。因此,您必须将“availableDataN”设置为一个字段,以便使用反射找到它。

最终的代码将如下所示:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class X {

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {

            Method shouldGetExecuted = X.class.getMethod("shouldGetExecuted" + i, String.class);
            boolean b = (boolean) shouldGetExecuted.invoke(null, context.getXXX());
            if (b) {
                Method tranformDataForField = X.class.getMethod("tranformDataForField");
                Field data = X.class.getField("availableData" + i); 
                Object result = tranformDataForField.invoke(null, data.get(null));
                Method set = X.class.getMethod("setField" + i, TransformDataType.class);
                set.invoke(null, result);
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

您需要适应您的具体情况。例如,这里我假设所有字段和方法都是静态的。如果不是,那么您需要将 null 替换为实例引用。