Dlaczego w interfejsie nie określono metody?Java: Przesłanki interfejsu Cloneable
Odpowiedz
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 metodyclone
. Oznacza to, że nie można przetestować, czy coś jest instancjąCloneable
, przesłać ją doCloneable
i wywołaćclone
. Musisz ponownie użyć refleksji, która jest okropna. To tylko jeden problem, ale z pewnością go rozwiążę.
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.
Zastanawiam się dlaczego nie dodać 'interfejs Copyable' Java 1.2 i poza ... – EpicPandaForce
@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. –
Ponieważ metoda klonowania jest zaimplementowana w klasie Object ze względu na jej "specjalny" warunek: kopie pamięci obiektów dowolnego rodzaju.
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ą:
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. –
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
@Serializable miałoby więcej sensu. A przynajmniej tak by się stało, gdyby adnotacje pojawiły się dziesięć lat wcześniej. –
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();
}
Jaki byłby sposób korzystania z tego interfejsu (PublicConeable)? – Otto
@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 –
Po zwróceniu obiektu z lokalnego pamięć podręczna na przykład ... To powiedziawszy, szeregowanie/deserializacja jest prawdopodobnie bezpieczniejsza. –
- 1. Nadpisywanie klonów zi bez Cloneable
- 2. Wyjątek CloneNotSupportedException nawet podczas implementacji Cloneable
- 3. zagubiony interfejsu JAVA
- 4. Jakie są przesłanki nagłówka daty HTTP?
- 5. Ogórek Tło i utrzymujące Scenariusze (lub przesłanki)
- 6. Java: Casting klasę niepowiązanych interfejsu
- 7. implementacja enum wewnątrz interfejsu - Java
- 8. Implementacja interfejsu Java w Scala
- 9. Dlaczego java udostępnia obiekt do deklarowania interfejsu wewnątrz interfejsu
- 10. Metoda klonowania interfejsu klonu
- 11. Jak możemy utworzyć obiekt interfejsu w java?
- 12. Jakie jest zastosowanie klonującego interfejsu w java?
- 13. Kotlin używa interfejsu wywołania zwrotnego Java
- 14. Równość wystąpienia interfejsu funkcjonalnego w java
- 15. Jakie są przesłanki dotyczące sposobu nazywania klas Qt?
- 16. Jakie są przesłanki, aby zezwolić na ucieczkę znaku `?`?
- 17. Redundant implementacja interfejsu List w ArrayList.java
- 18. Jak przekonać kompilator obiekt jest klonowalne (java)?
- 19. Konfigurowanie niestandardowych konwerterów za pomocą interfejsu API Dozer Java
- 20. Jak wywołać natychmiastową aktualizację interfejsu GUI Java? (konflikt z Thread.sleep())
- 21. Jak mogę utworzyć aplikację Java za pomocą interfejsu API Monkeyrunner?
- 22. Użyj interfejsu API .jar java library w języku C#?
- 23. Dlaczego można zadeklarować metodę interfejsu Java jako abstrakcyjną?
- 24. Interfejs Java zgłasza wyjątek, ale implementacja interfejsu nie generuje wyjątku?
- 25. Parsowanie daty interfejsu API Youtube w języku Java
- 26. Zatrzymywanie uruchomionego procesu za pośrednictwem interfejsu GUI, w java
- 27. Korekta interfejsu domyślnego języka Java 8 Metoda równa się metoda
- 28. Java rzuca NotSerializable wyjątek po dodaniu własnego interfejsu
- 29. Przenoszenie interfejsu java do cechy scala z generics
- 30. Implementowanie interfejsu Java Iterable <E> interface
Wzór jest głupi. Zastanawiam się, dlaczego Sun nigdy tego nie naprawił. – tactoth
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? –
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