java.lang.Cloneable
インターフェイスで.clone()
メソッドが指定されなかったのはなぜですか?Java:Cloneableインターフェイスの理由
答えて
基本的に、それは壊れたインタフェースです。 Ken ArnoldとBill VennersはそれについてJava Design Issuesで議論しました。
アーノルド:私はこの時点で神としていた、と多くの人が、私はないですおそらく喜んでいる場合
、私は
Cloneable
に問題があるため、Cloneable
を廃止し、Copyable
を持っていると言うでしょう。スペルが間違っていることの他に、Cloneable
にはclone
メソッドが含まれていません。つまり、何かがCloneable
のインスタンスであるかどうかをテストできず、Cloneable
にキャストし、clone
を呼び出します。リフレクションをもう一度使う必要があります。これはひどいです。それは唯一の問題ですが、私は確かに解決します。私は仕事のプロジェクトで
のJavaのバグデータベースにこのバグを参照してください:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
基本的に、これは彼らがそうするようCloneableインタフェースに修正するでしょう意図されていないことのJavaの以前のバージョンでは設計上の欠陥であります既存のコードとの互換性を損なう。
、我々は特定の状況でC++を模倣したくないので、彼らはおそらく... Javaの1.2を超えに – EpicPandaForce
@EpicPandaForceを 'Copyable'インタフェースを追加しなかった理由だろうか。クローニングは慎重に使用しなければなりませんが、ほとんどの場合、クローニングは達成したいものを達成しません。 Javaの欠点は 'const'パラメータを持つことですが、(変更可能な)すべてのオブジェクトインスタンスをコピーするのは良い解決策ではありません。そして、はい、Javaが吸うものがいくつかありますが、これもその一つです。Kotlin /データクラスを使用します。 –
「特別な」条件のために、クローンメソッドがObjectクラスで実装されているため、オブジェクトのメモリコピーがあります。
Javaでは、マーカーインターフェイスのこの概念があります。 Cloneable
インターフェイスにはメソッドやフィールドがなく、クローン可能であるというセマンティクスを識別するためだけに使用されます。 dev-xウェブサイトから
:
多くの場合、あなたは何の行動を持っていないのJavaのインターフェイスに出くわします。言い換えれば、それらは単に空のインターフェース定義です。これらは、マーカーインターフェイスとして知られています。 Java APIのマーカーインタフェースのいくつかの例は次のとおりです。
私はそれが奇妙なコンセプトだとは思わない。場合によっては、何かが代替タイプとして機能するかどうかを確認することが有用な場合もあります。他の人が言っているように、Cloneableは壊れています。 –
彼らはミックスインとして働くことになっています。 javaのような強く型付けされた言語で私のお気に入りのメカニズムではありませんが、Serializable、sortaには意味があります。 – wds
@Serializableは理にかなっていました。または、注釈が10年前に来た場合は、少なくとも完了しているはずです。 –
、我々はPublicCloneableと呼ばれるインターフェースを作成しました、 それはcloneメソッドが含まれており、それがパブリックであることを指定します。
私はこれが有用であることを発見しました。クローンメソッドがありますが、それにアクセスできないということはあまり役に立ちません。
public interface PublicCloneable extends Cloneable {
public Object clone();
}
このインターフェイス(PublicConeable)を使用する方法は何ですか? – Otto
@Otto:たとえば、public static PublicCloneable(PublicCloneable obj)メソッドを持つCloneHelper。nullをチェックするか、またはコピー(Object obj)し、nullとinstanceofの両方をチェックするPublicCloneable –
ローカルからオブジェクトを返すとつまり、シリアライズ/デシリアライズはおそらくより安全です。 –
- 1. SqlDataReader.ReadAsync()のインターフェイスがない理由
- 2. USBインターフェイス経由の外部論理メモリブロック?
- 3. インターフェイスAがインターフェイスBのプロパティを非表示にする理由
- 4. カスタムジェネリックタイプまたはインターフェイスを許可しない理由WinRTの理由
- 5. 文字列がComparableインターフェイスではなくComparatorインターフェイスを実装する理由
- 6. ワニスへの接続4ネットワーク経由の管理インターフェイス
- 7. デザインの決定:インターフェイスをプライベートにする理由と時期
- 8. インターフェイスの理解
- 9. インターフェイスにプロパティが含まれない理由
- 10. synchronizedメソッドがインターフェイスに含まれない理由
- 11. IEqualityComparerが必要な理由IEqualityComparer <T>インターフェイス?
- 12. Serializableインターフェイスを実装するクラスがインターフェイスのメソッドを実装しない理由を教えてください。
- 13. サブインターフェイスのインターフェイスのメソッド/メソッドをオーバーライドする理由は何ですか?
- 14. Powershellのいくつかのメソッドが定義でインターフェイスを使用する理由
- 15. インターフェイスの引数がすべての型を許可する理由
- 16. Web API DOMインターフェイスの理解
- 17. wlan-routerの管理インターフェイス
- 18. インターフェイスの代理人とイベント?
- 19. gRPC/Protobufインターフェイスのバージョン管理
- 20. JavaのSetインターフェイスにlast()メソッドとfirst()メソッドが存在しない理由
- 21. Retrofitでは、インターフェイスごとに1つの方法を使用する理由
- 22. エッジターミネーションSSL OpenShiftルート経由でinfinispan管理インターフェイスにアクセスできない
- 23. 理解DAOパターンとインターフェイス
- 24. 理由 - bashの
- 25. 理由
- 26. 理由
- 27. 理由
- 28. 理由
- 29. Apple WatchでのGlanceインターフェイスの管理
- 30. JavaScriptのメモリリークとクロージャ - その理由とその理由
デザインは馬鹿です。私はSunがこれを決して決してしなかったのだろうと思っている。 – tactoth
Java 8で修正されなかったのはなぜですか?以前にJavaの部分が削除/変更されていませんでしたか? –
それは何人かの人がそう言っているので「壊れましたか? "Cloneableにはクローンメソッドが含まれていません"と、そのドキュメントは決してそうは言っていませんでした。 "つまり、何かがCloneableのインスタンスであるかどうかテストできず、それをCloneableにキャストし、クローンを呼び出すことができます。これも、Cloneableの目的ではありません。 'Cloneable'は、' Object.clone() 'が例外をスローするかどうかを判断するだけです。 'clone'を呼び出すためのインターフェースとなったことはありません。もしJavaがそのようなインタフェースを持っていればいいかもしれませんが、インタフェースの欠如は別のインタフェース(Cloneable)を壊さないでしょう。 – newacct