23

Java 5より前では、注釈はありませんでした。その結果、クラスにメタデータを追加できませんでした。

クラスをシリアル化可能としてマークするには、Serializableインターフェイス(これはまさにマーカー)を実装し、さらにtransientキーワードを使用して、必要に応じてフィールドをシリアル化不可としてマークする必要があります。

public class MyClass implements Serializable {
   ...
   private transient Bla field;
   ...
}

これで、理論的には注釈を利用でき(これは注釈の完璧な使用法です)、次のようになります。

@Serializable
public class MyClass {
   ...
   @Transient
   private Bla field;
   ...
}

ただし、インターフェースとキーワードは非推奨ではなく、Java5ではそれらを置き換えるための注釈は追加されていません。

インターフェイスとキーワードを維持するためのこの決定の考慮事項は何ですか?

もちろん、Java 5より前のコードとの互換性の問題がありますが、ある時点で終了します(たとえば、ジェネリックスの新機能に関連して、JLSは、Javaプログラミング言語の将来のバージョンで使用が許可されない可能性があると指定しています生のタイプの)。では、シリアル化された注釈の方法も準備してみませんか?

何かご意見は?(私は具体的な参照を好むが:私は見つけることができなかったD )

4

4 に答える 4

21

インターフェイスが存在するため、Serializableタイプのオブジェクトを受け入れるようにメソッドを定義できます。

public void registerObject(Serializable obj);
于 2011-06-17T20:44:11.100 に答える
10

もちろん、Java5以前のコードとの互換性の問題があります...

はい。これが問題の根本です。

  • それらが(たとえば)Java 5@deprecatedSerializableインターフェースである場合、Java 5より前の古いコードの多くは警告(またはコンパイラー・スイッチによってはエラー)を出します。

  • Serializable人々にそれを交換するように「強制」することは実際には何も悪いことではありません。(人々はもっと良いことをする必要があります...)

  • 人々がコードでこれを「修正」すると、Java 5より前のコンパイラを使用してコンパイルしたり、Java5より前のJVMで実行したりすることはなくなります。

  • コンパイラを体系的に「泣き虫」にするようなことをするのは悪い考えです。

...しかし、ある時点でそれは終了します。

実際には、これが実際に発生する可能性は(IMO)小さいです。私の知る限り、Sun/Oracleは非推奨の機能を削除したことはありません。Thread.stop()友達 のような危険な人でさえありません。


脚注として、Go開発者はこの問題に対して異なるアプローチを取っています。言語やライブラリの機能を変更したいときは、それを行うだけです。これらは、必要に応じてコードを自動的に書き換えるコンバーターを提供します。

于 2011-06-18T00:17:47.767 に答える
2

Serializabletransient確かに、注釈で置き換えることができた2つのものです。

おそらく、使用するプログラムがたくさんSerializableあり、コンパイラが突然何千もの非推奨警告を吐き出し始めた場合、開発者が何百万人もの人々を悩ませていたため、これらは非推奨になりませんでした。

標準のJavaAPIには、はるか昔に廃止された可能性のあるものが他にもたくさんあります。たとえば、レガシーコレクションクラスVectorHashtable(そして、もっとたくさんのものを簡単に見つけることができると確信しています)。また、注釈を使用して実装できた可能性のあるものは他にもあります(たとえば、キーワード、、volatile)。strictfpsynchronized

于 2011-06-17T20:54:14.580 に答える
-1

非推奨は、積極的に有害なものに対するものです。あなたが提案しているのは、(当時の)既存のJavaコードの8年間の作成者に、Java 1.4で持っていた完全に正しいコードに戻すために、非推奨のコンパイラ警告をシャットダウンするだけで、それを書き直さなければならないということです。 。それは役に立たないでしょう。

于 2016-09-28T13:58:23.820 に答える