В Java, почему люди добавляют поля в `this`? - PullRequest
24 голосов
/ 02 января 2009

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

Пример:

public class Person {        
    private String name;

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

В toString, почему бы просто не указать name как name?

return name;

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

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

Ответы [ 16 ]

56 голосов
/ 02 января 2009
  1. Защитное программирование (в случае, если кто-то редактирует код позже, добавляет параметр или локальный с конфликтующим именем
  2. Сделать код «самодокументируемый» более очевидным
37 голосов
/ 02 января 2009

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

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

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

11 голосов
/ 02 января 2009

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

10 голосов
/ 02 января 2009

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

6 голосов
/ 02 января 2009

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

6 голосов
/ 02 января 2009

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

Нарушение этого правила происходит всякий раз, когда код содержит вызов члена экземпляра локального класса или базового класса, для которого нет префикса «this». Исключение из этого правила происходит, когда существует локальное переопределение члена базового класса, и код намеревается вызвать элемент базового класса напрямую, минуя локальное переопределение. В этом случае к вызову можно добавить префикс «base.», А не «this».

По умолчанию StyleCop запрещает использование подчеркивания или m_ для пометки полей локального класса в пользу префикса «this.». Преимущество использования «this.» Заключается в том, что оно в равной степени применяется ко всем типам элементов, включая методы, свойства и т. Д., А не только к полям, благодаря чему все вызовы членов класса могут быть мгновенно распознаны независимо от того, какой редактор используется для просмотра кода. , Другое преимущество состоит в том, что он создает быстрое, узнаваемое различие между элементами экземпляра и статическими элементами, которые не имеют префикса.

И последнее преимущество использования префикса "this." - это ввод этого. приведет к тому, что Visual Studio покажет всплывающее окно IntelliSense, что позволит разработчику быстро и легко выбрать члена класса для вызова.

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

3 голосов
/ 02 января 2009

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

«Java / Стиль кода / Очистка» в диалоге настроек.

3 голосов
/ 02 января 2009

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

2 голосов
/ 02 января 2009

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

Например в классе "Рациональный"

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

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;
    }
}

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

2 голосов
/ 02 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...