Java

Preferences API の設計に関する FAQ

設計に関する FAQ

ここでは、Preferences API の設計に関する FAQ をまとめてあります。

  1. Preferences API には、Properties API とどのような関連性がありますか。

    Preferences API は、Properties クラスの使用頻度の高いプロパティーを置き換える目的で設計されており、軽量さを維持しながら、さまざまな点を訂正しています。Properties API を使用するときは、各プロパティーファイルのパス名を明示的に指定する必要があります。ただし、プロパティーファイルの標準の場所または名前の規約はありません。プロパティーファイルは任意に編集できますが、破壊しやすいため、慎重に編集する必要があります。Properties API では、文字列以外のデータ型は使用できません。Properteis API の持続性を保持するには、ファイルシステムを使用する必要があります。これらのことから、Properties API には拡張性はありません。

  2. Preferences API には、JNDI とどのような関連性がありますか。

    Preferences API では、JNDI と同様に、持続的なキー/値のデータにアクセスするときに、バックエンドの中立性が確保されます。ただし、JINDI は強力な重量インタフェースです。JNDI は、強力な機能を必要とする企業アプリケーションに適しています。Preferences API は、単純で、汎用的な、バックエンドの中立性を持つ設定管理機能として設計されています。あらゆる Java アプリケーションの動作を、ユーザーの要望に合わせて簡単に調整できます。また、アプリケーションの実行状態も、いくつかの項目で管理できます。

  3. すべての get メソッドから呼び出し側にデフォルトを渡す必要があるのはなぜですか。

    アプリケーションに適切なデフォルト値を渡すことによって、リポジトリが利用できない場合でも、アプリケーションはそのデフォルト値で実行することができます。

  4. BackingStoreException をスローするメソッドは、どのようにして決定されたのですか。

    この例外をスローするメソッドは、そのセマンティクスがバッキングストアとの通信を常に必要としているメソッドだけです。通常のアプリケーションでは、このようなメソッドを呼び出す必要はありません。バッキングストアを利用できない場合でも、このようなメソッドを呼び出さない限り、アプリケーションを実行できるようにすることが設計の目標でした。

  5. 複数の VM による同時アクセスを、この API でより強力にサポートしないのはなぜですか。同様に、複数の設定の更新を結合して単一トランザクションに組み込み、すべて更新するかまったく更新しないセマンティクスを適用しないのはなぜですか。

    この API は、持続性のある基本的なデータ記憶域として使用し、データベースの代わりとしては使用しません。この API は、標準の設定/構成リポジトリ上に実装できるようにすることが重要です。これらのリポジトリのほとんどでは、データベースのような機能は提供していません。これらのリポジトリは、この API の設計目的を満たしています。

  6. この API のキーとノード名では、なぜ大文字と小文字が区別されるのですか。 同様の環境で動作する他の API (Microsoft Windows Registry、LDAP など) では、区別されていません。

    Java プログラミング言語では、大文字と小文字が区別される String キーが一般的です。特に、String キーは、Properties クラスによって提供されます。この API は、Properties クラスを置き換える目的で設計されています。Properties を使用するときに、大文字と小文字を区別することもあります。たとえば、Java パッケージ名をキーとして使用するときに、大文字と小文字を区別することがあります。キーの大文字と小文字を区別すると、そのキーを使用してバッキングストア上に Preferences を実装する作業が複雑になります。しかし、Preferences API でプログラミングするプログラマが増えていけば、実装工数の増加は吸収できると考えられます。

  7. この API で Java 2 Collections Framework が使用されないのはなぜですか。

    この API は、特定の目的に合わせて設計および最適化されています。この API では汎用データ型を使用できません ( JSR-14 を参照)。このため、標準的なユーザーにとっては多少使いにくいかもしれません。Map API への準拠が適用されている場合でも、コンパイル時に型保証しません。また、他の Map 実装との相互運用性は想定していません。ただし、相互運用性が必要な場合は、アダプタクラスを実装すれば対応できます。しかし、Preferences API は、Map と類似した設計になっているため、Map を習熟していれば簡単に使用できます。

  8. put および remove 系のメソッドが古い値を返さないのはなぜですか。

    put および remove 系のメソッドは、バッキングストアが利用できない場合でも、実行できなければなりません。これらのメソッドから古い値を返す必要がある場合は、この要件に対応できなくなります。また、この API を一般的なバックエンドデータストア上に実装した場合に、パフォーマンスが低下することがあります。

  9. この API の保存済みデフォルトはどんな目的で使用しますか。また、なぜ必須ではないのですか。

    保存済みデフォルトは、企業設定に必要な機能です。つまり、企業全体の設定を管理するときの拡張性および費用効率を向上させることができます。しかし、単一ユーザーの設定をユーザー自身が管理する場合には、過剰な機能です。

  10. 任意の直列化可能オブジェクトの読み取り/書き込みを行うメソッドが、この API に組み込まれていないのはなぜですか。

    直列化可能オブジェクトには、壊れやすいオブジェクトです。このようなプロパティーを読み取るプログラムは、プロパティーを書き出すプログラムと異なる場合は、直列化可能オブジェクトが正しくまたはまったく直列化復元されないことがあります。直列化可能オブジェクトは、この API を使用して格納できます。ただし、この方法は推奨していないうえ、対応するメソッドも用意していません。

  11. Preferences がインタフェースでなく、抽象クラスなのはなぜですか。

    新しいメソッドを追加するときに上方互換性を保証することは、Preferences を「mixin」として使用できなくなる短所 (任意のクラスを Preferences オブジェクトとして機能させることができない) を上回ると判断しました。また、static メソッド用のクラスを個別に用意する必要がなくなります。インタフェースには、static メソッドを組み込むことはできません。


Copyright © 2006 Sun Microsystems, Inc. All Rights Reserved.

コメントの送付先: TBP
Sun
Java Software