java - 按层次顺序获取类

标签 java inheritance logic

我想为包编写一个方法,以获取分层结构中包含的类,例如 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/

相关文章:

java - 我如何在运行时找出我的 JVM 中配置的垃圾收集算法?

java - HeadersTooLargeException - 响应 header

Java - 将类方法分离到不同的文件中

c++ - 多个基类可以有相同的虚方法吗?

java - 如何反转使用 NULL 的 boolean 逻辑语句(将 "SELECT"条件更改为 "DISCARD"条件)

java - 检查输入类型...如何?

具有继承性的 Java Builder 模式

java - 在java中如何处理 super ?

python - 如何使用 Tkinter 和函数找到哪个复选按钮被选中?

functional-programming - 版本号背后的含义(即 0.1、0.10.10、1 等)