Проходит 'this' в методе, который признал принятой практикой в ​​java

Хорошая/плохая/приемлемая практика - передать текущий объект в вызове метода. Как в:

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)?

Ответ 1

Нет причин не использовать его, this - текущий экземпляр, и он совершенно законно используется. На самом деле часто нет чистого способа опустить его.

Так что используйте его.

Как трудно убедить его приемлемым без примера (отрицательный ответ на такой вопрос всегда проще аргументировать), я только что открыл один из наиболее распространенных классов java.lang, String один, и, конечно же, я найденные примеры этого использования, например

1084        // Argument is a String
1085        if (cs.equals(this))
1086            return true;

Ищите (this в больших "принятых" проектах, вы не сможете его найти.

Ответ 2

В этом нет ничего плохого. Что означает НЕ хорошая практика - это делать те же внутренние конструкторы, потому что вы дадите ссылку на еще не полностью полностью инициализированный объект.

Здесь есть своего рода сообщение: Java утечка этого в конструкторе  где они дают объяснение, почему последняя является плохой практикой.

Ответ 3

Да, но вы должны быть осторожны в двух вещах

  • Передача этого, когда объект еще не сконструирован (т.е. в его конструкторе)
  • Передача этого объекта с длительным проживанием, который сохранит ссылку, и предотвратит сбор этого объекта.

Ответ 4

Это совершенно нормально и вполне приемлемо.

Ответ 5

это означает текущий объект. То, что вы делаете, является синтаксически правильным, но я не вижу необходимости в этом, если вы вызываете метод в том же классе.

Ответ 6

Да. вы можете использовать его. Он просто распространен в программировании для передачи this. Но есть плюсы и минусы об использовании этого. Все это не опасно.

Ответ 7

Плохая практика передавать текущий объект в вызов метода, если для достижения такого же поведения существуют менее сложные альтернативы.

По определению, двунаправленная связь создается, как только this передается от одного объекта к другому.

Чтобы процитировать Рефакторинг, Мартин Фаулер:

Изменить двунаправленную ассоциацию на однонаправленную (200)

Двунаправленные ассоциации полезны, но они несут цену. цена - это дополнительная сложность поддержания двусторонних ссылок и чтобы объекты были правильно созданы и удалены. Двунаправленный ассоциации не являются естественными для многих программистов, поэтому они часто являются источник ошибок

...

Вы должны использовать двунаправленные ассоциации, когда вам нужно, но не когда вы этого не делаете. Как только вы видите двунаправленную связь, нет более длинный потянув его вес, сбросьте ненужный конец.

Итак, теоретически, мы должны слышать тревожные звонки, когда мы находим, что нам нужно пройти this и попытаться очень тяжело подумать о других способах решения проблемы. Конечно, есть моменты, когда, в крайнем случае, имеет смысл сделать это.

Также часто бывает необходимо временно испортить ваш дизайн, делая "плохие практики", в течение более длительного времени рефакторинг вашего кода для общего улучшения. (На один шаг назад, два шага вперед).

На практике я обнаружил, что мой код улучшил массово, избегая двунаправленных ссылок, таких как чума.

Ответ 8

Просто добавьте еще один пример, где передача this верна и соответствует хорошему дизайну: Шаблон посетителя. В шаблоне проектирования посетителей метод accept(Visitor v) обычно реализуется так, как он просто вызывает v.visit(this).

Ответ 9

Приемлемый

Фрагмент документа Oracle JAVA:

Внутри метода экземпляра или конструктора это ссылка на текущий объект - объект, метод или конструктор которого называется. Вы можете обратиться к любому члену текущего объекта изнутри метод экземпляра или конструктор, используя это.

Используя это с полем

Наиболее распространенная причина использования этого ключевого слова заключается в том, что поле затенен параметром метода или конструктора.

Ответ 10

Все в java передается по значению. Но объекты НИКОГДА не передаются методу!
Когда java передает объект методу, он сначала создает копию ссылки на объект, а не копию самого объекта. Следовательно, этот метод используется в java. И чаще всего используется использование.