Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:测试两个对象之间多个属性的不平等性_Java_Oop_Design Patterns_Comparison - Fatal编程技术网

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

Java:测试两个对象之间多个属性的不平等性,java,oop,design-patterns,comparison,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; } } …您希望将一个updatedoc与另

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

假设您有两个类的对象
Document

public class Document {
    String project;
    String folder;
    public String getProject() { return project; }
    public String getFolder() { return folder; }
}
…您希望将一个
updatedoc
与另一个
existingDoc
进行比较,以根据哪些属性已更改来调用不同的函数。要做到这一点,最有效的方法是什么,记住任何一个对象中的值都可以为null

按照程序,我可能会这样写:

// 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();
这是非常丑陋的,如果我要比较第三或第四个属性,它会变得指数级的糟糕。那么最好的方法是什么呢

我见过
Comparable
Comparator
,但它们似乎更适合于排序相等比较。在这种情况下,这仍然是一条路吗

提前谢谢

你的“生命学”不是问题,而是你的方法。如果您确实有四个方法要调用,那么您将需要四个独立的
If
检查;对于第三个属性,您将有8个方法,因此方法计数是指数增长的

您可以将
both()
重构为
project();文件夹(),或者,如果它是不可约的,那么您需要处理不可约的指数增长


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

您想确定两个是否相等,还是您的目标是对一组进行排序?不尝试排序,只是尝试决定调用哪个方法(例如,如果两个属性都更改,则两者都()调用;如果只有项目更改,则project()调用;等等).战略模式在这里有用吗?