2013-08-08 9 views
5

名前付き定数の代わりに暗号アルゴリズムの標準名を作成する際にSunが決定した根拠はありますか?名前付き定数を持たない標準名

documenting algorithm namesには明白な努力がなされていますが、ライブラリ内には厳密に定義された名前付き定数はありません。私は、クロスプラットフォームの観点から、文字列検索アプローチが有利だと理解しています。

しかし、そうすることで、プログラムのエラーが実行時に遅れていることを意味します。これは、必要以上に難しいことがわかります。どうしてこれなの?

+1

おそらくまだ修正されていない設計上の問題でした。あなたは、アルゴリズムの名前を指し示す独自の定数(おそらく 'enum'の中に)を持つことができます。ここではなく、Oracleフォーラムでこれを投稿する方がよいでしょう。 –

+0

@LuiggiMendoza私は、定数よりも文字列を選択するのに影響があったかもしれないいくつかの理由を追加しました。私はこれが機能であり、問​​題ではないと確信しています。 –

答えて

1

私はこれがあなた自身の非標準的な名前と工場の実装を考え出すことができると思います。 (または、まだ存在しない名前を使用する将来のプラグインを許可する)ことができます。

これにより、コンパイル時に知られていなかったクラスパスをクラスに追加することで、実行時に新しい暗号クラスを追加することもできます。

1

Stringは、例えば、 Cipher.getInstance(String algorithm)には単一の名前が含まれていないため、変換も含まれています。あなたは、パディングを必要としない8ビット出力の暗号フィードバックモードで、DESアルゴリズムを示す"DES/CFB8/NoPadding"のようなものを持っています。この組み合わせは、他の暗号でも使用できます。したがって、これはすでにcipher * modes * bitsizes * paddingmodesに等しい数の定数を生成します。今では別々の列挙を作成することができますが、既にどこが傷つき始めるかを見ることができます。

文字列は、列挙型よりもはるかに柔軟性があり、定数もそこにはありません。これにより、アルゴリズムを追加するのが非常に簡単になります。アルゴリズムを追加して、より古いソフトウェアに設定することもできます。指定されたアルゴリズムを実装するプロバイダを追加するだけです。これは、プロバイダとサービスから構築された動的なフレームワークで使用する場合に非常に重要です。

Luiggiが示しているように、enumを取り、CipherまたはSignatureインスタンスを返すファクトリを作成するのは簡単です。あなたは一度だけ工場をテストする必要があります。

+0

または流暢なインターフェイスパターンを持つ荒野。 –

+0

@LuiggiMendoza確かに、個人的には私はそのデザインパターンがそんなに好きではありません。だからあなたは 'cipherBuilder.setAlgorithm(ALGO).setMode(MODE).buildCipher()'を得るでしょうか? –

関連する問題