Быстрее, чем приведенные выше решения, включая решение с самым высоким рейтингом:
(x < 0) ? -1 : (x > 0)
Будьте очень осторожны при использовании клона. Фактически, я бы полностью этого избегал. Я никогда не нуждался в этом. НО ... как уже было сказано, лучшее обсуждение темы, которое я когда-либо читал, было написано Джошуа Блохом в Эффективной Java. Прочтите пункт 11: «Прекращайте клонирование разумно»
ПОЖАЛУЙСТА, сделайте себе одолжение и прочтите этот пункт. На самом деле я рекомендую прочитать всю эту главу (и остальную часть книги). Все, что вам нужно знать о клоне и почему я предупреждаю вас об этом, находится там.
Надеюсь, это поможет.
Object.clone () имеет реализацию:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html# clone ()
Эта ссылка объясняет интерфейс Cloneable: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html
Чтобы вызвать метод clone (), объект должен реализовывать интерфейс Cloneable, в противном случае генерируется исключение CloneNotSupportedException.
По определению, все классы в Java расширяют базовый класс Object, а класс Object имеет метод clone () по умолчанию, хотя сам Object не реализует Cloneable. Метод clone () класса Object будет вызван, если вы не переопределите его самостоятельно.
Если у меня есть: "класс foo реализует cloneable "
, а затем выполните: bar = new foo (); bar.clone ();
Я получаю неглубокую копию без необходимости написать любой код bar.clone (), как я обычно нужно делать, когда я реализовать интерфейс.
Это будет работать, только если вы вызываете его в классе "foo", потому что метод .clone (), унаследованный от Object
, защищен.
Я понимаю, что функции интерфейса должны быть заполнены in классом, реализующим его, и Object.clone () не имеет реализации (согласно документации, «Объект класса сам не реализует interface Cloneable ")
(1) Object.clone ()
действительно имеет реализацию. Он создает мелкую копию объекта, если объект реализует Cloneable
. (2) Метод .clone ()
не является частью какого-либо интерфейса. (3) Наличие метода .clone ()
и реализация интерфейса Cloneable
- это совершенно разные вещи. Вам нужно реализовать интерфейс Cloneable
, только если вы собираетесь использовать метод clone
объекта Object
, однако это рекомендуемый способ написать clone
для вашего класса - чтобы получить его копию из метода суперкласса clone
, который в конечном итоге переходит в метод Object
clone
.