Почему в Java люди добавляют к полям `this`?

Почему при ссылке на переменные класса к нему добавляется this? Я говорю не о случае, когда this используется для устранения неоднозначности в параметрах метода, а о том, когда это кажется ненужным.

Пример:

public class Person {        
    private String name;

    public String toString() {
        return this.name;
    }
}

Почему бы в toString просто не ссылаться на name как на name?

return name;

Что покупает this.name?

Вот - вопрос о переполнении стека, код которого предварительно ожидает this.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
25
0
2 321
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Кроме разрешения неоднозначности с параметрами метода, это ничего вам не даст. Может быть, ясность / читаемость, но это действительно зависит от вашего стиля.

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

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

Kezzer 02.01.2009 10:59

Я не думаю, что это улучшает понимание. ИМО, конечно. Я не знаю, что такое может случиться с некоторыми.

Adeel Ansari 02.01.2009 11:25

Я думаю, что это субъективно и по отношению к человеку.

Kezzer 02.01.2009 16:43

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

Joseph Daigle 02.01.2009 17:48

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

MetroidFan2002 02.01.2009 22:40

Беспорядок в коде - это субъективно. Но в любом случае вы, вероятно, не захотите полагаться на «цвет», чтобы различать объем кода. Это значительно ограничивает возможности. Что, если я программист с цветной привязкой?

Joseph Daigle 03.01.2009 01:27

Программист с дальтонизмом может настроить IDE для отображения маркера для устранения неоднозначности. Я полагаю, что цель @ MetroidFan2002 - автоматизировать подобные вещи.

HRJ 22.07.2014 08:45
  1. Защитное программирование (в случае, если кто-то редактирует код позже, добавляет параметр или локальный параметр с конфликтующим именем
  2. Сделайте код "самодокументированным" более очевидным.

Иногда необходимо устранить неоднозначность:

public void setFoo(Bar foo) {
    this.foo = foo;
}

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

Это помогает вам с первого взгляда идентифицировать переменные-члены. ToString () выше слишком мал, чтобы это проиллюстрировать. Предположим, у вас есть метод размера экрана. Вы вычисляете, назначаете и меняете местами локальные переменные и переменные экземпляра. this.memberVar или this.PropertyName помогают отслеживать, где вы изменяете состояние экземпляра, с помощью назначения полей или установщиков свойств.

Возможно, они программисты на Python и их замучат / потеряют / запутают без явного указания this.

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

Однако, если вы берете PHP, использование $this обычно обязательный при обращении к переменным класса. При различных правилах между языками часто проще всего придерживаться шаблона, который является общим для них, шаблон, который оказывается очень твердым стилем кодирования повсюду. Мне проще просто добавить this ко всему, чем пытаться вспомнить, для какого языка это требуется, а для какого языка он просто «предпочитает».

Я чаще всего вижу, как люди делают это, потому что это запускает intellisense. Лично я предпочитаю опускать слово «это». потому что он создает больше кода без какой-либо ценности.

Но вы все равно можете запускать intellisense и без него. Control-Space на пустой ссылке в Eclipse и IntelliJ запускает intellisense. Он идентичен Control-Space из this..

Steve Kuo 18.05.2011 05:29

"this" предотвращает путаницу с переменными экземпляра с тем же именем в родительском классе / классах.

Это в значительной степени дополнение к добавлению "super".

Я стараюсь использовать this.whatever при написании больших фрагментов кода, потому что было легче понять, на что ссылаются. При чтении больших кусков кода, написанного другими людьми, в определенные моменты я часто не понимал, ссылаются ли они на переменные экземпляра или локальные переменные.

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

Это не влияет на производительность, не создает проблем для читабельности (если вообще облегчает чтение).

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

В мире .NET инструмент Microsoft StyleCop также имеет правило под названием «Префикс локальных вызовов с помощью этого»:

A violation of this rule occurs whenever the code contains a call to an instance member of the local class or a base class which is not prefixed with ‘this.’. An exception to this rule occurs when there is a local override of a base class member, and the code intends to call the base class member directly, bypassing the local override. In this case the call can be prefixed with ‘base.’ rather than ‘this.’.

By default, StyleCop disallows the use of underscores or m_ to mark local class fields, in favor of the ‘this.’ prefix. The advantage of using ‘this.’ is that it applies equally to all element types including methods, properties, etc., and not just fields, making all calls to class members instantly recognizable, regardless of which editor is being used to view the code. Another advantage is that it creates a quick, recognizable differentiation between instance members and static members, which are not be prefixed.

A final advantage of using the ‘this.’ prefix is that typing this. will cause Visual Studio to show the IntelliSense popup, making it quick and easy for the developer to choose the class member to call.

Я предлагаю выбрать соглашение (использовать это или нет) и придерживаться его.

Код читается проще. Другой хорошей практикой, на мой взгляд, является вызов getXXX() и в toString() (вместо this.XXX), потому что getXXX() может иметь важную логику.

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

Небольшое отступление, но, возможно, стоит отметить, что инструмент «Очистка» в Eclipse может быть настроен на автоматическое добавление / удаление этого. доступ к членам в соответствии с предпочтениями.

«Java / Code Style / Clean Up» в диалоговом окне настроек.

Ответ принят как подходящий

По той же причине, почему некоторые люди предпочитают добавлять к частным элементам данных "m_" или именовать интерфейсы "IFoo". Они считают, что это увеличивает читаемость и ясность. Согласны ли вы с подобными условностями или нет - дело вкуса.

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

Например в классе «Рационал»

Вместо того, чтобы делать

class Rational
{
    int denominator;
    int numerator;

    public Rational(int d, int n)
    {
        denominator = d;
        numerator = n;
    }
}

Я делаю это.

class Rational
{
    int denominator;
    int numerator;

    public Rational(int denominator, int numerator)
    {
        this.denominator = denominator;
        this.numerator = numerator;
    }
}

Таким образом, вызывающие абоненты знают больше о том, для чего нужны параметры конструктора.

Другие вопросы по теме