我想讨论收集(大量)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?
}
}
什么是解决此问题的不错的代码风格解决方案?
Trivial会将Object c
传递到TaskExecution
及其所有子方法中,所以我可以在发生Hint
时保存它。可以,但是我感觉它的风格很差。
private Object method3(Object a, Object b, Object result2, ImportantObject c) {
dbService.saveHint(new Hint(), c);
return new Object();
}
我还可以在任何地方传递列表来收集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;
}
我考虑过将提示放入缓存并在TaskExecutor
中读取它们。但是,如果我不缓存它们链接到ImportantObject c
的实例,则会失去其含义。我无法确定缓存中的对象是否链接到我当前的ImportantObject
实例。
如果我不使用spring并始终创建Delegate
的新实例,那将是一个解决方案
public class Delegate {
private List<Hint> hints = new ArrayList<>();
// ...
}
但是,好吧……春天在这里是有原因的:-)