我想为包编写一个方法,以获取分层结构中包含的类,例如 this ,但对于无限数量的父类(super class)型。 没有父类(super class)型的方法位于列表的开头,它们在最后扩展类。
我的方法受到冒泡排序的启发,检查邻居是否是父类(super class)型之一,如果是,则交换类。
List<GenClass> getOrderedGenClasses() {
List<GenClass> classes = new ArrayList<>(getGenClasses()); //the unordered classes
for (int i=0; i<classes.size(); i++){ //the bubble sort approach to check e
for (int j=i+1; j<classes.size(); j++){
List<GenClass> superclasses = classes.get(i).getBaseGenClasses(); //gets the superclasses for comparison
for(int k=0; k<superclasses.size();k++) { //just checks if the superclass is contained
if (superclasses.get(k).getName() == classes.get(j).getName()){
Collections.swap(classes, i, j); //if it is contained swap the neighbours
break;
}
}
}
}
return classes;
}
对于某些类,它可以工作,但有些类的顺序仍然不正确。我做错了什么?
最佳答案
实际问题可能在这里:
superclasses.get(k).getName() == classes.get(j).getName()
使用 equals() 方法比较字符串;不是通过使用 == !!!
但除此之外,基本的答案(“我在这里做错了什么”)是:您没有使用 TDD .
TDD 是解决此类问题的完美技术。你看,你有(希望)非常明确的要求。
您可以/应该通过将需求放入测试用例中来“简单地”明确您的需求。然后添加代码来完成该测试。然后你编写下一个测试。不断地...
这只是避免了您现在面临的情况:您有一堆(复杂的)生产代码,它似乎有时工作,但不是“一直”。而您不知道从哪里开始。
但是让我们给您一些更具体的建议:研究分离关注点。您在该代码中混合了不同的职责。
您应该有一个方法/类来“收集”包中的所有类/接口(interface)。无需排序,只需确保您准确找到您想要找到的类(class)即可。
然后,您编写以某种方式在该集合上运行的代码。通过这样做,您还可以更轻松地提出小型、清晰的测试 - 测试“类”收集器”比测试“排序类收集器”更容易。
关于java - 按层次顺序获取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576905/