/* * 練習問題3.11 p.99 * ソートアルゴリズムが、気づかれることなくメトリックスに関して不正を行えるSortDoubleのセキュリティホールを * 少なくとも1つ見つけなさい。そのセキュリティホールをなくすように修正しなさい。 * この場合、ソートアルゴリズムの作成者はmainを書かないと想定してください */ package ch03.ex03_11; public abstract class SortDouble { private int SortCount = 0; private double[] values; private final SortMetrics curMetrics = new SortMetrics(); /** 全ソートをするために呼び出される */ public final SortMetrics sort(double[] data) { values = data; // -- 改良部分ここから -- if (SortCount > 0) { System.out.println("doSort is used " + (SortCount + 1) + " times!"); } else { curMetrics.init(); } SortCount++; // -- 改良部分ここまで -- /* * // オリジナル curMetrics.init(); */ doSort(); return getMetrics(); } public final SortMetrics getMetrics() { return curMetrics.clone(); } /** 拡張したクラスが要素の数を知るため */ protected final int getDataLength() { return values.length; } /** 拡張したクラスが要素を調べるため */ protected final double probe(int i) { curMetrics.probeCnt++; return values[i]; } /** 拡張したクラスが要素を比較するため */ protected final int compare(int i, int j) { curMetrics.compareCnt++; double d1 = values[i]; double d2 = values[j]; if (d1 == d2) { return 0; } else { return (d1 < d2 ? -1 : 1); } } /** 拡張したクラスが要素を交換するため */ protected final void swap(int i, int j) { curMetrics.swapCnt++; double tmp = values[i]; values[i] = values[j]; values[j] = tmp; } /** 拡張したクラスが実装する -- ソートするのに使用される */ protected abstract void doSort(); }