Java>8でも機能するソリューション
質問が機能について明示的に言及していないという事実にもかかわらずstore(OutputStream out, String comments)
、私はこれ(およびload(InputStream inStream)
それぞれ)がの最も興味深い部分であると思いますProperties
。
プロパティの保存/読み込みに関心がない場合はProperties
、一部Map
またはSortedMap
実装に置き換えることができます。
Properties
との違いは、いくつかの特定のシリアル化ルールを提供する/メソッドMap
の存在です 。これらのルールは、Javaバージョン間で変更されていません(変更されません)。例えばstore()
load()
- のようなペアを保存する
prop=value
- Unicodeおよび特殊文字のエスケープルール。
- オプションのコメントを上に追加
残念ながら、機能の上記の3つの部分はプライベートメソッド内に隠されており、異なる内部データ構造を使用したい拡張または代替実装内で簡単に再利用することはできません(たとえば、プロパティを並べ替えたままにするため)。
したがって、残っているのは、同じ内部構造を維持し、2つのメソッドをオーバーライドするstore()
ことです。
注:ソートされたプロパティを取得するために、しばらく前にdanisupr4の実装に従いましたが、java9では機能しませんでした。
TL; DR
以下のコードは、メソッドのみをオーバーライドすることでの完全な機能を維持し、-からのすべてのバージョンでテストされています。
このパブリックメソッドの出力をフィルタリングすると、クラス内の将来のコード変更に対する実装の脆弱性が低くなると思います。Properties
store(OutputStream out, String comments)
java5
java12
java.util.Properties
class SortedStoreProperties extends Properties {
@Override
public void store(OutputStream out, String comments) throws IOException {
Properties sortedProps = new Properties() {
@Override
public Set<Map.Entry<Object, Object>> entrySet() {
/*
* Using comparator to avoid the following exception on jdk >=9:
* java.lang.ClassCastException: java.base/java.util.concurrent.ConcurrentHashMap$MapEntry cannot be cast to java.base/java.lang.Comparable
*/
Set<Map.Entry<Object, Object>> sortedSet = new TreeSet<Map.Entry<Object, Object>>(new Comparator<Map.Entry<Object, Object>>() {
@Override
public int compare(Map.Entry<Object, Object> o1, Map.Entry<Object, Object> o2) {
return o1.getKey().toString().compareTo(o2.getKey().toString());
}
}
);
sortedSet.addAll(super.entrySet());
return sortedSet;
}
@Override
public Set<Object> keySet() {
return new TreeSet<Object>(super.keySet());
}
@Override
public synchronized Enumeration<Object> keys() {
return Collections.enumeration(new TreeSet<Object>(super.keySet()));
}
};
sortedProps.putAll(this);
sortedProps.store(out, comments);
}
}
注:誰がを呼び出すかによってはstore()
、既存のメソッドをオーバーライドせずに、新しいメソッドを作成する方がよい場合がありますstoreSorted()
。
また、簡単にするために、store()
メソッドの1つだけをオーバーライドしますが、同じ概念が両方に適用されます。