Java: Альтернатива использованию .clone () при изменении аргумента? - PullRequest
0 голосов
/ 21 февраля 2012

Так что мне всегда говорили, что модифицировать аргументы для методов - это плохая практика (по крайней мере, когда это не интуитивно понятно). Обычно я бы использовал что-то простое, например:

  public Type method(Type Object) {
    Type otherObject = Object.clone();
            // do stuff to otherObject

    return otherObject;
}

Это то, чем я занимаюсь довольно часто, слабо. Есть ли лучший способ сделать это? Например, способ сделать так, чтобы java передавался по значению, а не по ссылке, чтобы изменение аргумента не имело непредвиденных последствий для пользователей моих классов. Помимо того, что методы клонирования менее понятны (вроде), предположительно выполняются за время O (n), так что отсутствие необходимости делать это было бы неплохо.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

С точки зрения безопасности (и это, как правило, делает нас честными), clone обычно не то, что нужно делать (кроме HttpCookie - это изменчиво, но final). Если объект имеет хитрую реализацию, вы также будете копировать это.

Лучшее, что вы можете сделать, это сделать, Type неизменным. Проблема уходит. Нет необходимости копировать.

Если это изменяемое значение, просто создайте копию - new Type(object) или что-то еще. Помните, что копирование следует выполнять перед проверкой правильности содержимого объекта, чтобы избежать ошибок времени проверки (TOCTOU / TOC2TOU).

0 голосов
/ 22 февраля 2012

Если у вас есть переменные X и Y типа SomeClass, которые включают в себя конструктор копирования, и кто-то говорит X = new SomeClass(Y);, когда Y не нуль, тогда X получит новый экземпляр, которыйбудет иметь тип SomeClass, независимо от фактического типа Y.Напротив, если вместо этого использовать X = (SomeClass)Y.clone(), и фактический тип Y правильно реализует clone , он получит объект того же типа, что и Y.Какой подход «лучше», будет зависеть от того, как программа должна вести себя с производными типами.

...