Пишет “это”. перед переменной экземпляра и методами хороший или плохой стиль?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

35
задан 10 revs, 5 users 23% 19 November 2014 в 18:10
поделиться

20 ответов

Я думаю, что это менее читаемо, особенно в средах, где поля выделяются по-другому по сравнению с локальными переменными. Единственное время я хочу видеть "это", - когда оно требуется, например:

this.fieldName = fieldName

При присвоении поля.

Однако если Вам нужен некоторый способ дифференцировать поля по некоторым причинам, я предпочитаю "this.fieldName" другим соглашениям, как "m_fieldName" или "_fieldName"

44
ответ дан cynicalman 27 November 2019 в 06:27
поделиться

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

public void setFoo(String foo) {
    this.foo = foo; //member assignment
}

public doSomething() {
    doThat(); //member method
}

у меня есть коллеги, которые предпочитают:

public void setFoo(String foo) {
    _foo = foo;
}
0
ответ дан user23313 27 November 2019 в 06:27
поделиться

Если Вы собираетесь устранить необходимость добавить это. перед членскими переменными, инструменты статического анализа такой как checkstyle может быть неоценимым в обнаружении случаев, где членские переменные скрывают поля. Путем удаления таких случаев можно устранить необходимость использовать это во-первых. Это сказанное я предпочитаю игнорировать эти предупреждения в случае конструкторов и методов set вместо того, чтобы иметь необходимость придумать новые названия параметров метода:).

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

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

0
ответ дан Peter Kelley 27 November 2019 в 06:27
поделиться

Я раньше всегда использовал это... Тогда коллега указал мне, что в целом мы стремимся уменьшить ненужный код, таким образом, то правило не должно применяться здесь также?

0
ответ дан dicroce 27 November 2019 в 06:27
поделиться

С.Net точки зрения некоторые инструменты анализа кода, которые я использовал, видели "это" и сразу пришли к заключению, что метод не мог быть статичным. Это может быть что-то для тестирования с Java, но если это делает то же там, Вы могли бы пропускать некоторые улучшения производительности.

0
ответ дан Austin Salonen 27 November 2019 в 06:27
поделиться

"Удобочитаемость"

я нашел полезными использование "это" особенно если не использование IDE (маленькие быстрые программы)

Whem, мой класс является достаточно большим для делегирования некоторых методов к новому классу, заменяя "это" "otherRef", это очень легко с большей частью простого текстового редактора.

т.е.

//Before
this.calculateMass();
this.perfornmDengerAction();
this.var = ...
this.other = ...

После "осуществления рефакторинг"

// after
this.calculateMass();
riskDouble.calculateMass();
riskDouble.setVar(...);
this.other = ... 

, Когда я использую IDE, я обычно не использую его. Но я думаю, что это делает Вас вещью в большем количестве OO путь, чем просто использование метод.

class Employee {

        void someMethod(){
             // "this" shows somethings odd here.
             this.openConnectino() ; // uh? Why an employee has a connection???
             // After refactor, time to delegate.
             this.database.connect(); // mmhh an employee might have a DB.. well.. 
         }
     ... etc....
}

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

1
ответ дан OscarRyz 27 November 2019 в 06:27
поделиться

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

1
ответ дан Owen 27 November 2019 в 06:27
поделиться

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

1
ответ дан Tim Mooney 27 November 2019 в 06:27
поделиться

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

2
ответ дан Chris R 27 November 2019 в 06:27
поделиться

Я использую this по крайней мере по двум причинам:

причины Ошибок

мне нравится иметь последовательные стили кода при кодировании в C++, C, Java, C# или JavaScript. Я сохраняю меня с помощью того же стиля кодирования, главным образом вдохновленного Java, но вдохновленного другими языками.

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

Мой код скорее verbous. Мои имена методов могут быть долгими (или не). Но они всегда используют полные имена, и никогда уплотняемые имена (т.е. getNumber(), не getNbr()).

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

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

Настоящие причины

, В то время как я ценю работу компилятора, существуют некоторые неоднозначности, я хотел бы сделать Однозначности.

, Например, я (почти) никогда не использую using namespace MyNamespace. Я или использую полное пространство имен или использую псевдоним с тремя буквами. Я не люблю неоднозначностей и не люблю его, когда компилятор внезапно говорит мне, что существуют также функции "печать", сталкивающаяся вместе.

Это - причина, я снабжаю префиксом функции Win32 глобальным пространством имен, т.е. всегда пишу ::GetLastError() вместо GetLastError().

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

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

Мое Заключение?

, В целом, эта проблема имеет главным образом стиль, и с подлинными техническими причинами. Я не захочу смерть кого-то не запись this.

Что касается кавычки Bruce Eckel от его "Думающего Java"... Я не был действительно впечатлен смещенным Java/C++ сравнений, который он продолжает делать в своей книге (и отсутствие сравнения с C#, странно), таким образом, его персональная точка зрения [приблизительно 1 113], сделанные в сноске... Хорошо...

2
ответ дан paercebal 27 November 2019 в 06:27
поделиться

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

Рассматривают следующий код:

int f();

template <typename T>
struct A
{
  int f();
};

template <typename T>
struct B : A<T>
{
  int g()
  {
    return f();
    return this->f();
  }
};

Теперь, существуют два f() вызовы в B<T>::g(). Можно было бы ожидать, что он будет звонить A<T>::f(), но только второй будет. Первое будет звонить ::f(). Причина позади этого состоит в том, что, потому что A<T> зависит от T, поиск обычно не находит его. this, будучи указателем на B<T>, также зависит от [1 110] однако, поэтому если Вы будете использовать его, поиск будет задержан, до окончания B<T> инстанцирован.

Примечание, что это поведение не может присутствовать на некоторых компиляторах (а именно, MSVC), которые не реализуют двухфазный поиск имени, но тем не менее это - корректное поведение.

3
ответ дан coppro 27 November 2019 в 06:27
поделиться

По-моему, Вы делаете его более читаемым. Это сообщает потенциальным будущим диагностическим средствам для факта, где функция, которую Вы вызываете.

111-секундный, не невозможно иметь функцию с тем же самым глобальным именем или от некоторого пространства имен это, которое получает "использование" 'редактор в конфликт. Таким образом, если будет конфликт, то исходный автор кода будет знать наверняка, какую функцию они вызывают.

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

4
ответ дан Sqeaky 27 November 2019 в 06:27
поделиться

Я нахожу, что меньше больше. Чем более напрасно подробный спам Вы имеете в своем коде, тем больше трудных людей будет иметь поддержание его. Однако наличие ясного и последовательного поведения также важно.

5
ответ дан Russell Myers 27 November 2019 в 06:27
поделиться

Более читаемый, я думаю. Я делаю это Ваш путь по точно тем же причинам.

6
ответ дан jeffm 27 November 2019 в 06:27
поделиться

Иногда мне действительно нравится писать классы как это:

class SomeClass{
    int x;
    int y;

    SomeClass(int x, int y){
        this.x = x
        this.y = y
    }
}

Это облегчает говорить то, что аргумент устанавливает что участник.

9
ответ дан Jason Baker 27 November 2019 в 06:27
поделиться

3 Причины (Иск номекса НА [1 118])

1) Стандартизация

2) Удобочитаемость

3) IDE

1) важная персона Не часть стиля кода Java Sun.

(Никакая потребность иметь любые другие стили для Java.)

Так не делают этого (в Java.)

Это - часть вещи Java "синего воротничка": это всегда - то же везде.

2) Удобочитаемость

, Если Вы хотите this.to, имеет this.this перед каждым this.other this.word; Вы действительно this.think это улучшаете this.readability?

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

Вы [только 1 122] имеют членские переменные, и у Вас нет глобальных переменных или функций в Java. (В другом langunages у Вас могут быть указатели, массив превышенные, неконтролируемые исключения и глобальные переменные также; наслаждаться.)

, Если Вы хотите сказать, находится ли метод в Вашем родительском классе классов или не... не забывает помещать @Override на Ваши объявления и позволять компилятору сказать Вам, если Вы не переопределяете правильно. super.xxxx () является стандартным стилем в Java, если Вы хотите назвать родительский метод, иначе пропустите его.

3) IDE Любой пишущий код без IDE, который понимает язык и дает схему на боковой панели, может сделать так на их собственном никеле. Понимание, что, если это не' чувствительный язык, Вы захватываетесь в 1950-х. Без GUI: Захваченный в 50-х.

Любой достойный IDE или редактор скажут Вам, откуда функция/переменная. Даже оригинал VI (< 64 КБ), сделает это с CTags. Существует просто никакое оправдание для использования дрянных инструментов. Хорошие отданы бесплатно!.

10
ответ дан Tim Williscroft 27 November 2019 в 06:27
поделиться

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

if (0 == someValue)
{
    ....
}

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

if (someValue = 0)

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

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

причины, которые я услышал главным образом, сводятся к, "он - лучшая практика" обычно цитирование Josh Bloch Эффективный Java, который имеет огромное влияние здесь. На самом деле, однако, Bloch даже не использует его, где даже я думаю, что ему, вероятно, придется помочь удобочитаемости! Еще раз это, кажется, больше вид вещи, сделанной людьми, которым говорят сделать это и не знают почему!

Лично, я склонен согласиться больше с тем, что Bruce Eckel говорит в Размышлении в Java (3-и и 4-е выпуски):

<час>

'Некоторые люди одержимо поместят это перед каждым вызовом метода и ссылкой поля, утверждая, что это делает его "более ясным и более явным". Не делайте этого. Существует причина, что мы используем высокоуровневые языки: Они делают вещи для нас. Если Вы поместите это в том, когда это не будет необходимо, Вы будете смущать и раздражать всех, кто читает Ваш код, начиная со всей остальной части кода, который они считали , не будет использование это везде. Люди ожидают это использоваться только, когда это будет необходимо. После последовательного и простого стиля кодирования экономит время и деньги'.

<час>

сноска, p169, Думая в Java, 4-й выпуск

Вполне. Меньше больше, люди.

16
ответ дан Rob Gilliam 27 November 2019 в 06:27
поделиться

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

можно также хотеть проверить этот вопрос:
, Какой префикс Вы используете для членских переменных?

17
ответ дан Community 27 November 2019 в 06:27
поделиться

Люди Python делают все это время, и почти все они предпочитают его. Они записывают его 'сам' вместо 'этого'. Существуют пути вокруг этого, помещая явный 'сам' в, но согласие состоит в том, что явный 'сам' важно для понимания метода класса.

2
ответ дан S.Lott 27 November 2019 в 06:27
поделиться

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

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

0
ответ дан 27 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: