2009-04-02 10 views

答えて

36

基本的に、それは壊れたインタフェースです。 Ken ArnoldとBill VennersはそれについてJava Design Issuesで議論しました。

アーノルド:私はこの時点で神としていた、と多くの人が、私はないですおそらく喜んでいる場合

、私はCloneableに問題があるため、Cloneableを廃止し、Copyableを持っていると言うでしょう。スペルが間違っていることの他に、Cloneableにはcloneメソッドが含まれていません。つまり、何かがCloneableのインスタンスであるかどうかをテストできず、Cloneableにキャストし、cloneを呼び出します。リフレクションをもう一度使う必要があります。これはひどいです。それは唯一の問題ですが、私は確かに解決します。私は仕事のプロジェクトで

+0

デザインは馬鹿です。私はSunがこれを決して決してしなかったのだろうと思っている。 – tactoth

+0

Java 8で修正されなかったのはなぜですか?以前にJavaの部分が削除/変更されていませんでしたか? –

+3

それは何人かの人がそう言っているので「壊れましたか? "Cloneableにはクローンメソッドが含まれていません"と、そのドキュメントは決してそうは言っていませんでした。 "つまり、何かがCloneableのインスタンスであるかどうかテストできず、それをCloneableにキャストし、クローンを呼び出すことができます。これも、Cloneableの目的ではありません。 'Cloneable'は、' Object.clone() 'が例外をスローするかどうかを判断するだけです。 'clone'を呼び出すためのインターフェースとなったことはありません。もしJavaがそのようなインタフェースを持っていればいいかもしれませんが、インタフェースの欠如は別のインタフェース(Cloneable)を壊さないでしょう。 – newacct

10

のJavaのバグデータベースにこのバグを参照してください:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

基本的に、これは彼らがそうするようCloneableインタフェースに修正するでしょう意図されていないことのJavaの以前のバージョンでは設計上の欠陥であります既存のコードとの互換性を損なう。

+0

、我々は特定の状況でC++を模倣したくないので、彼らはおそらく... Javaの1.2を超えに – EpicPandaForce

+0

@EpicPandaForceを 'Copyable'インタフェースを追加しなかった理由だろうか。クローニングは慎重に使用しなければなりませんが、ほとんどの場合、クローニングは達成したいものを達成しません。 Javaの欠点は 'const'パラメータを持つことですが、(変更可能な)すべてのオブジェクトインスタンスをコピーするのは良い解決策ではありません。そして、はい、Javaが吸うものがいくつかありますが、これもその一つです。Kotlin /データクラスを使用します。 –

1

「特別な」条件のために、クローンメソッドがObjectクラスで実装されているため、オブジェクトのメモリコピーがあります。

6

Javaでは、マーカーインターフェイスのこの概念があります。 Cloneableインターフェイスにはメソッドやフィールドがなく、クローン可能であるというセマンティクスを識別するためだけに使用されます。 dev-xウェブサイトから

多くの場合、あなたは何の行動を持っていないのJavaのインターフェイスに出くわします。言い換えれば、それらは単に空のインターフェース定義です。これらは、マーカーインターフェイスとして知られています。 Java APIのマーカーインタフェースのいくつかの例は次のとおりです。

+1

私はそれが奇妙なコンセプトだとは思わない。場合によっては、何かが代替タイプとして機能するかどうかを確認することが有用な場合もあります。他の人が言っているように、Cloneableは壊れています。 –

+0

彼らはミックスインとして働くことになっています。 javaのような強く型付けされた言語で私のお気に入りのメカニズムではありませんが、Serializable、sortaには意味があります。 – wds

+5

@Serializableは理にかなっていました。または、注釈が10年前に来た場合は、少なくとも完了しているはずです。 –

5

、我々はPublicCloneableと呼ばれるインターフェースを作成しました、 それはcloneメソッドが含まれており、それがパブリックであることを指定します。

私はこれが有用であることを発見しました。クローンメソッドがありますが、それにアクセスできないということはあまり役に立ちません。

public interface PublicCloneable extends Cloneable { 
    public Object clone(); 
} 
+1

このインターフェイス(PublicConeable)を使用する方法は何ですか? – Otto

+0

@Otto:たとえば、public static PublicCloneable(PublicCloneable obj)メソッドを持つCloneHelper。nullをチェックするか、またはコピー(Object obj)し、nullとinstanceofの両方をチェックするPublicCloneable –

+0

ローカルからオブジェクトを返すとつまり、シリアライズ/デシリアライズはおそらくより安全です。 –

関連する問題