非静态比较器内部类

时间:2014-10-21 14:04:49

标签: java static comparator

我想知道是否可以创建实现比较器接口的非静态内部类。

例如

public class A {
   private Map<String, Integer> scoreMap;

   private final class myComparator implements Comparator<MyOtherClass> {

       private int calScore(MyOtherClass ob) {
           int score = ob.someValue * ob.otherValue;
           scoreMap.put(ob.getName(), score);
       }

       public int compare(MyOtherClass ob1, MyOtherCLass ob2) {
           return Integer.compare(calScore(ob1), calScore(ob2));
       }   

   }

}

我想使用比较器类非静态因为我想使用非静态字段“num”并想要修改它的值。有非静态比较器内部类很好吗?

其他信息

对于每个对象,我正在计算得分内的得分并相应地排序。我需要将这些分数保存在我在比较器中计算的地图中,并希望在外部类中使用此地图进行进一步计算。

1 个答案:

答案 0 :(得分:1)

从技术上讲,没有什么能阻止你。然而,道德......

只要你保持幂等性(多次运行并得到相同的结果),那就不是不正确的。然而,这是一个副作用。 (使用这个比较器,一些类的值会改变。运行另一个比较器,没有任何变化)。副作用并不一定是坏的,但它们使程序更复杂,更难理解和调试。

尝试通过必须维护代码的一些可怜的灵魂的眼睛来看待它。一些价值变化,他们不知道为什么。他们所做的就是比较一份无关联的清单。

无论如何你的例子很抽象,所以很难判断上下文,但通常没有必要做你想做的事。除非你有充分的理由,否则通常应该避免这种情况。这个真正的理由不应该是&#34;因为我不想再次循环数据集&#34;在我看来。

来自你的编辑:

你试图通过不必再从它的声音重新计算来节省自己的工作。你真的只需要少量的努力就能省去自己。为什么不首先计算得分,存储结果,然后对结果进行排序(在得分字段上)

像:

public static class ScoredEntry {
    private SomeGameData data; //or something
    private int score;
    // constructor takes data + score,  imagine getters, setters, I am lazy ok.
}

public List<ScoredEntry> scoreEntries(List<SomeGameData> gameData) {
    List<ScoredEntry> result = new ArrayList<ScoredEntry>();
    for (SomeGameData data : gameData) {
        int score = calculateScore(data);
        result.add(new SCoredEntry(score, data);
    }
    return result;
}

public void sortBySCore(List<ScoredEntry> list) {
    Collections.sort(list, new Comparator<ScoredEntry>() {
        public int compare(SCoredEntry a, ScoredEntry b) {
            // etcetera.
        }
    }
}