2009-05-27 7 views
1

私は、多くの不変クラスを含むプロジェクトに取り組んでいます。これらのクラスを封印してマークすることに興味がありますが、後でクラスの「アンシール」を決めると、APIの顧客にランタイムエラーまたはコンパイルエラーが発生する可能性があります。この懸念に何かメリットはありますか、クラスを開封してランタイム/コンパイル時間の問題を起こさないでしょうか?クラスを開封すると、実行時またはコンパイル時にブレークが発生しますか?

+0

Jon Skeetが継承のために設計されていないクラスの開封のアイデアについて不平を言っていないと、私は残念です。継承を念頭に置いてこれらのクラスを設計していない場合は、後で開封すると事態が崩れる可能性があります。継承のためにそれらを設計している場合、それらをシールする必要はありません。 – Brian

+0

私はあなたがいたら簡単なテストをするでしょう:) – Grzenio

+0

私はコンパイル時やランタイムのブレークを引き起こさなかった素早く簡単なテストを実行しましたが、反射のようなものは考慮しませんでした。回答)。それは私が心配していることですが、私はそれが壊れるかもしれないと考えていない巧妙なコードです。 私たちがクラスを開封する理由は....うまくいけません。私は、これが起こるべきかどうか、先の結果を知りたいと思います。 – JadeMason

答えて

4

クラスを開封しても、コンパイル時にエラーは発生しません。クラスを開封すると、以前はコンパイル不可能なコードをコンパイルできるようになりますが、その逆はできません。

ランタイムの問題が数多く発生する可能性がありますが、コンシューマーがタイプメタデータを検査する必要があるため、非常に稀ですと思います。たとえば、タイプが開封された場合にユーザーがスローすることは可能ですが、それが大きな懸念事項であるかどうかはわかりません。

+0

実行時の例外は何か分かりますか?私は将来の参照のために文書化されている実行時例外を取得したいと思います。 – JadeMason

+0

@ JadeMason、これは、ユーザーがその場合に投げたものに非常に依存するためです。 – JaredPar

0

更新されたバージョンのフレームワークでクラスからsealed属性を削除するだけで、クラスから派生させることができますが、以前はそうできませんでした。あなたの更新版では、クライアントがクラスから派生する必要がない限り、私は何の問題も考えられません。

クラスの開封のもう1つの効果は、ランタイムがいくつかの仮想関数呼び出しを最適化できないことですが、それでも問題は起こりません。

関連する問題