2009-04-02 13 views

Odpowiedz

36

Zasadniczo, to jest przerwane interfejsu. Ken Arnold i Bill Venners omówili to w Java Design Issues.

Arnold:

Gdybym miał być Bóg w tym momencie, a wiele osób pewnie zadowolony nie jestem, powiedziałbym potępiać Cloneable i mają Copyable, ponieważ Cloneable ma problemy. Poza tym, że jest błędnie napisany, Cloneable nie zawiera metody clone. Oznacza to, że nie można przetestować, czy coś jest instancją Cloneable, przesłać ją do Cloneable i wywołać clone. Musisz ponownie użyć refleksji, która jest okropna. To tylko jeden problem, ale z pewnością go rozwiążę.

+0

Wzór jest głupi. Zastanawiam się, dlaczego Sun nigdy tego nie naprawił. – tactoth

+0

Dlaczego nie zostało to naprawione w Javie 8? Czy wcześniej nie usunięto/zmieniono części Javy, które zostały złamane/nieskuteczne? –

+3

Jest "zepsuty", ponieważ kilka osób tak mówi? "Cloneable nie zawiera metody klonowania" Tak, a jej dokumentacja nigdy nie mówiła, że ​​tak. "Oznacza to, że nie możesz sprawdzić, czy coś jest instancją Klasyfikowalnej, rzucić ją do Klasy, i wywołać klon". Ponownie, to w ogóle nie jest celem 'Cloneable'. 'Cloneable' jest po to, aby' Object.clone() 'rzucił wyjątek lub nie. To nigdy nie był interfejs do wywoływania 'clone'. Może byłoby miło, gdyby Java miała taki interfejs, ale brak jednego nie powoduje uszkodzenia innego interfejsu ('Cloneable'). – newacct

10

Zobacz ten błąd w bazie danych bugs Java:

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

Zasadniczo, jest to wada projektu we wcześniejszych wersjach Java, że ​​nie są oni zamierzają rozwiązać w Cloneable interfejs jak mogłoby to złamać kompatybilność z istniejącym kodem.

+0

Zastanawiam się dlaczego nie dodać 'interfejs Copyable' Java 1.2 i poza ... – EpicPandaForce

+0

@EpicPandaForce Prawdopodobnie dlatego, że nie chcemy naśladować C++ w pewnych sytuacjach. Klonowanie powinno być używane ostrożnie, przez większość czasu nie osiąga tego, co chcesz osiągnąć. Brakującą rzeczą w Javie jest posiadanie parametrów "const", ale kopiowanie każdej (mutowalnej) instancji obiektu nie jest dobrym rozwiązaniem. I tak, jest kilka rzeczy, w których Java jest do bani, i to jest jedna z nich.Użyj klas Kotlin/danych. –

1

Ponieważ metoda klonowania jest zaimplementowana w klasie Object ze względu na jej "specjalny" warunek: kopie pamięci obiektów dowolnego rodzaju.

6

W języku Java istnieje koncepcja interfejsów znaczników. Interfejs Cloneable nie ma żadnych metod ani pól i służy tylko do identyfikacji semantyki klonowania.

ze strony dev-x:

Często można natknąć interfejsów w Javie, które nie mają zachowania. Innymi słowy, są to po prostu puste definicje interfejsów. Są one znane jako interfejsy znaczników. Niektóre przykładowe interfejsy markerową Java API obejmują:

+1

Nie sądzę, że to dziwna koncepcja. Czasami warto zobaczyć, czy coś może działać jako alternatywny typ. Jak powiedzieli inni, Klonowalna jest zepsuta. –

+0

Mają działać jako mixiny. Nie mój ulubiony mechanizm w mocno napisanym języku, takim jak java, ale ma sens dla Serializable, sorta. – wds

+5

@Serializable miałoby więcej sensu. A przynajmniej tak by się stało, gdyby adnotacje pojawiły się dziesięć lat wcześniej. –

5

W projekcie pracuję nad, stworzyliśmy interfejs o nazwie PublicCloneable, zawiera metodę klonowania i określa, że ​​jest publiczna.

Uważam, że jest to przydatne: fakt, że istnieje metoda klonowania, ale nie można uzyskać do niej dostępu, nie pomaga bardzo.

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

Jaki byłby sposób korzystania z tego interfejsu (PublicConeable)? – Otto

+0

@Oto: na przykład CloneHelper z publiczną publiczną statyczną kopią PublicCloneable (PublicCloneable obj), która sprawdza wartość NULL, lub po prostu kopiuje (Object obj) i sprawdza zarówno NULL jak i wystąpienie PublicCloneable –

+0

Po zwróceniu obiektu z lokalnego pamięć podręczna na przykład ... To powiedziawszy, szeregowanie/deserializacja jest prawdopodobnie bezpieczniejsza. –

Powiązane problemy