Это хорошая / плохая / приемлемая практика - передавать текущий объект в вызове метода. Как в:
public class Bar{
public Bar(){}
public void foo(Baz baz){
// modify some values of baz
}
}
public class Baz{
//constructor omitted
public void method(){
Bar bar = new Bar();
bar.foo(this);
}
}
В частности, bar.foo(this)
приемлема ли линия ?
Ответы:
Нет причин не использовать его,
this
это текущий экземпляр, и его вполне законно использовать. На самом деле часто нет четкого способа пропустить это.Так что используйте это.
Поскольку трудно убедить, что это приемлемо без примера (отрицательный ответ на такой вопрос всегда легче аргументировать), я просто открыл один из наиболее распространенных
java.lang
классовString
, и, конечно же, я нашел примеры этого использования, напримерИщите
(this
в больших «принятых» проектах, не преминете найти.источник
this
не означает, что вы добавляете двунаправленную ссылку, например, из-за наследования и интерфейсов.В этом нет ничего плохого. Что НЕ является хорошей практикой, так это делать то же самое внутри конструкторов, потому что вы дадите ссылку на еще не полностью инициализированный объект.
Здесь есть что-то вроде похожего поста: Java пропускает это в конструкторе, где они объясняют, почему последнее - плохая практика.
источник
Car
конструктор может создаватьWheel
экземпляры, при этом объектCar
безWheel
объекта будет инициализирован не полностью, а объектWheel
без соответствующегоCar
объекта также будет инициализирован не полностью. В этом случае в конструкторе Car может быть допустимо перейтиthis
к конструктору Wheel. Другой альтернативой было бы сделать и Car, и Wheel иметь частный конструктор и использовать фабричную функцию, которая конструирует Car, Wheel и устанавливает Wheel на Автомобиль; но должен ли это быть статический метод для Car или статический метод для Wheel?CarFactoryWheelInstallerProxy
которая устанавливает колеса за вас.Wheel
полностью подчиняетсяCar
, и ИМО не должна знать об этомCar
.this
изнутри конструктора заключается в том, чтоthis
он передается в метод или контекст, из которого еще не полностью построенная ссылка на объект публикуется для ненадежных или неизвестных клиентов (или клиентского кода, который предполагает, что он имеет представление о полностью построенный объект). Наthis
мой взгляд, переход от конструктора к частному для пакета методу, который выполняет общую инициализацию, не только приемлем, но и желателен.Да , но вы должны быть осторожны с двумя вещами
источник
this
к нему. Это было бы невозможно, если бы объект не был выделен.Это совершенно нормально и вполне приемлемо.
источник
это означает текущий объект. То, что вы делаете, систематически правильно, но я не вижу в этом необходимости, если вы вызываете метод в том же классе.
источник
this
между двумя классами. Таким образом, нет необходимости добавлять дополнительную сложность.Передавать текущий объект в вызове метода - плохая практика, если есть менее сложные альтернативы для достижения того же поведения.
По определению, двунаправленная ассоциация создается, как только
this
передается от одного объекта к другому.Процитируем рефакторинг Мартина Фаулера:
Итак, теоретически мы должны слышать сигнал тревоги, когда обнаруживаем, что нам нужно пройти,
this
и очень стараемся придумать другие способы решения данной проблемы. Конечно, бывают случаи, когда в крайнем случае имеет смысл это делать.Также часто бывает необходимо временно испортить ваш дизайн, выполняя «плохие практики», во время более длительного рефакторинга вашего кода для общего улучшения. (Шаг назад, два шага вперед).
На практике я обнаружил, что мой код значительно улучшился, поскольку он избегал двунаправленных ссылок, как чумы.
источник
this
передачи.equals
- Object. Это очень распространено: принимающий метод определяет свой аргумент как более общий класс или как интерфейс. Одна из причин, по которой такой шаблон используется в Java, - избежать нежелательных зависимостей. Прежде чем продолжить, я бы посоветовал вам взглянуть на многие случаи передачи вthis
качестве аргумента в уважаемых java-библиотеках.this
кода. Я бы порекомендовал сделать это другим.Да. вы можете использовать его. Это обычное дело в программировании. Но у его
this
использования есть свои плюсы и минусы. Тем не менее, это не опасно.источник
Просто чтобы добавить еще один пример, когда прохождение
this
правильное и следует хорошему дизайну: шаблон посетителя . В шаблоне проектирования Visitor методaccept(Visitor v)
обычно реализуется в виде простого вызоваv.visit(this)
.источник
Приемлемый
Фрагмент из документов Oracle JAVA:
источник
this
в качестве параметра? ».this.some_variable
ссылаться на переменную класса, а не на локальную переменную. Это не имеет ничего общего с передачейthis
в качестве параметра.Все в java передается по значению. Но объекты НИКОГДА не передаются в метод!
Когда java передает объект методу, она сначала создает копию ссылки на объект, а не копию самого объекта. Следовательно, это идеально используемый метод в java. И чаще всего следил за использованием.
источник
this
ссылки на примитивный тип, и поэтому я думаю, что ваша «дополнительная информация» вносит путаницу.