按层次顺序获取类

时间:2017-01-10 19:33:44

标签: java inheritance logic

我想为一个包编写一个方法来获取像this这样的层次结构中包含的类,但是对于无限数量的超类型。 没有超类型的方法在列表的开头,并且最后扩展了类。

我的方法受到冒泡排序的启发,并检查邻居是否是其中一种超类型,如果是,则交换类。

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;
  }

对于某些类它可以工作,但有些仍然没有正确的顺序。我做错了什么?

1 个答案:

答案 0 :(得分:1)

实际的问题可能在这里:

superclasses.get(k).getName() == classes.get(j).getName()

使用equals()方法比较字符串;不是通过使用== !!!

但除此之外,基本答案(对于&#34;我在这里做错了什么&#34;)是:你使用TDD

TDD是针对此类问题的完美技术。你看,你(希望)有非常明确的要求。

你可以/应该通过&#34;简单地&#34;通过将它们放入测试用例来明确您的要求。然后添加代码以完成该测试。然后你写下一个测试。等等...

这简单地避免了你现在面临的情况:你有一堆(复杂的)生产代码,它似乎有时,但不是&#34;所有的时间&#34; 。你不知道从哪里开始。

但是,让我们给你一些更具体的建议:研究分离问题。您正在混合该代码中的不同职责。

您应该拥有一个方法/类,以便&#34;收集&#34;包中的所有类/接口。没有排序,只要确保你得到你想要找到的那些课程。

然后,您编写以某种方式对该集合起作用的代码。通过这样做,您还可以更轻松地进行小而清晰的测试 - 更容易测试一个&#34;类&#34;收集器&#34;,与测试&#34;排序类收集器&#34;。