У меня было бы колесо реализовать интерфейс, который имеет только методы доступа, i.е: -
Пример
interface WheelInterface
{
int getSize();
}
class Wheel implements WheelInterface
{
// methods
}
class Axis
{
public Axis(WheelInterface wheel)
{
// Only getSize will be available
}
}
Теперь, просто передать WheelInterface вместо колеса и только методы доступа будут доступны конструктором класса оси
Преимущество
Преимущества этого в том, что копирования не требуется; вы просто предоставляете контракт классу Axis, и этот контракт гласит, что он может получить только размер, а не изменять его.
Пройдя эту же ссылку на объект по значению, вам не нужно называть какой-либо конструктор копий и не нужно беспокоиться о семантике глубокого и мелкого копирования. Я бы не хотел использовать Clone на моем колесе, я думаю, что это немного грязно по причинам, упомянутым в комментариях к другим ответам.
В объектно-ориентированном шаблоне использование интерфейса для абстрагирования от того, что вам не нужно, также является признаком хорошего дизайна. Если ваше колесо имеет зимние шины, ваш класс Axis, вероятно, даже не нужно заботиться!
Недостатками
Как уже упоминалось, можно отливать интерфейс обратно к конкретному типу (как уже упоминалось, если вы знаете, что вы литья в); это называется downcasting, и я не рекомендую его; если бы это было сделано по аналогичному сценарию, вероятно, он не прошел бы мимо обзора .
Спасибо за ваш ответ :). Я тоже подумал об этом. Просто хотел знать, есть ли способ или «ключевое слово», например. окончательный (его не окончательный), который может быть использован. – eclipse
В C# ICloneable не рекомендуется, так как вызывающий не может отличить, является ли клон глубокой или мелкой копией. Является ли Cloneable одинаковым в java и поэтому не следует использовать? – chrisw
@ chrisw69 Да, 'clone()' обычно не нравится также сообществу Java, см. [Здесь, например] (http://jcranky.com/2009/08/26/why-not-use-java- клон-метод /). Я отредактировал сообщение, чтобы удалить упоминание об этом - возможно, не стоит его поощрять. –