在任务执行过程中收集复杂日志对象的最佳方法

时间:2019-06-18 16:30:27

标签: java

我想讨论收集(大量)java代码执行期间发生的数据的不同方法,这些数据不需要继续进行但应存储。在我的情况下,另外一个困难是,存储辅助对象需要另一个对象,否则该对象在所有子方法中都是不必要的。

基本上,我有一个类(TaskExecutor)将复杂的任务委派给另一个组件(Delegate)。仅需要一个对象(ImportantObject c)保存侧面对象(List<Hint>)。这些提示不是执行任务执行所必需的,仅用于将复杂数据记录到我的数据库中。但是它们链接到此ImportantObject c

@Component
public class TaskExecutor {

@Autowired
private Delegate delegate;

public void execute() {
        Object a = new Object();
        Object b = new Object();
        ImportantObject c = new ImportantObject(); // only needed to save hints

        Object result = delegate.performTask(a, b);

    }
}

public class Delegate {

    public Object performTask(Object a, Object b) {
        method1(a);
        Object result2 = method2(a);
        Object result3 = method3(a, b, result2);

        return result3;
    }

    private void method1(Object a) {
        new Hint();
    }

    private Object method2(Object a) {
        new Hint();
        return new Object();
    }

    private Object method3(Object a, Object b, Object result2) {
        new Hint();
        return new Object();
    }
}

public class DbService {

    public void saveHints(List<Hint> hints, ImportantObject c) {
        // How to call this?
    }
}

什么是解决此问题的不错的代码风格解决方案?

想法1:将对象传递到任何地方

Trivial会将Object c传递到TaskExecution及其所有子方法中,所以我可以在发生Hint时保存它。可以,但是我感觉它的风格很差。

    private Object method3(Object a, Object b, Object result2, ImportantObject c) {
        dbService.saveHint(new Hint(), c);
        return new Object();
    }

想法2:无处不在的通行证列表

我还可以在任何地方传递列表来收集Hints。因此,我只需要将此列表和ImportantObject c放在一起即可。也感觉像是不好的编码风格。

public class TaskExecution {

    public Object performTask(Object a, Object b) {
        List<Hint> hints = new ArrayList<>();
        method1(a, hints);
        Object result2 = method2(a, hints);
        Object result3 = method3(a, b, result2, hints);

        return result3;
    }

想法3:使用一些缓存

我考虑过将提示放入缓存并在TaskExecutor中读取它们。但是,如果我不缓存它们链接到ImportantObject c的实例,则会失去其含义。我无法确定缓存中的对象是否链接到我当前的ImportantObject实例。

想法4:字段变量(如果没有Spring)

如果我不使用spring并始终创建Delegate的新实例,那将是一个解决方案

public class Delegate {

    private List<Hint> hints = new ArrayList<>();

    // ...
}

但是,好吧……春天在这里是有原因的:-)

0 个答案:

没有答案