Java:测试两个对象之间多个属性的不等式

时间:2014-03-07 21:35:49

标签: java oop design-patterns comparison

这更像是一般的OOP /设计模式问题,但我在Java中工作,所以我对Java解决方案很感兴趣。

假设你有两个班级Document的对象......

public class Document {
    String project;
    String folder;
    public String getProject() { return project; }
    public String getFolder() { return folder; }
}

...并且您希望将一个updatedDoc与另一个existingDoc进行比较,以根据更改的属性调用不同的函数。最有效的方法是什么,请记住,任一对象中的值都可以为空?

在程序上,我可能会写这样的东西:

// Convert null values to empty Strings
String updatedProject = updatedDoc.getProject() == null ? "" : updatedDoc.getProject();
String existingProject = existingDoc.getProject() == null ? "" : existingDoc.getProject();
String updatedFolder = updatedDoc.getFolder() == null ? "" : updatedDoc.getFolder();
String existingFolder = existingDoc.getFolder() == null ? "" : existingDoc.getFolder();

boolean projectChanged = !updatedProject.equals(existingProject);
boolean folderChanged = !updatedFolder.equals(existingFolder);

if (projectChanged && folderChanged)
    both();
else if (projectChanged)
    project();
else if (folderChanged)
    folder();
else
    neither();

这是非常难看的,如果我不得不比较第三或第四属性,它会成倍地变得更糟。那么最好的方法是什么?

我见过ComparableComparator,但看起来他们更喜欢订购平等比较。在这种情况下,这仍然是可行的吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

你的" ifology"不是问题,而是你的方法。如果你真的有四种方法可以调用,那么你需要进行四次单独的if检查;使用第三个属性,您将拥有8个方法,因此方法计数是指数增长的方法。

您或者能够将both()重构为project(); folder();,或者,如果它不可简化,那么您将有不可约的指数增长来处理。

在这种情况下减少分支逻辑的唯一可能方法是反射结合方法的良好命名约定,或者(不太建议)某种策略模式使方法成为一流,然后允许你将它们存储在一个方便的结构中,并查找所需的方法。这在精神上与反思非常相似,但需要更多的样板。