我想知道是否可以创建实现比较器接口的非静态内部类。
例如
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”并想要修改它的值。有非静态比较器内部类很好吗?
其他信息
对于每个对象,我正在计算得分内的得分并相应地排序。我需要将这些分数保存在我在比较器中计算的地图中,并希望在外部类中使用此地图进行进一步计算。
答案 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.
}
}
}