вызывающий метод Versus class.method - PullRequest
1 голос
/ 08 декабря 2008

У меня есть класс с двумя методами, определенными в нем.

public class Routines {

     public static method1() {
      /* set of statements */
     }

     public static method2() {
      /* another set of statements.*/
     }
}

Теперь мне нужно вызвать method1 () из method2 ()

Какой из следующих подходов лучше? Или это можно квалифицировать как вопрос?

public static method2() {

        method1();

}

OR

public static method2() {

        Routines.method1();

}

Ответы [ 6 ]

12 голосов
/ 08 декабря 2008

Хотя я согласен с существующими ответами, что это в первую очередь проблема стиля, достаточно проблемы стиля, когда критики кода как Eclipse, так и IntelliJ отметят «нестатические ссылки на статические методы» в коде, который не использует Classname.method() стиль.

Я сделал привычкой подчеркивать намерение , используя имя класса для квалификации ссылок на статические цели, this для квалификации ссылок на цели экземпляров и голые имена для локальных ссылок. Современная IDE будет использовать различную подсветку для этих конструкций, поэтому я полагаю, что это менее важно в наши дни. Мне нравится, чтобы сопровождающий (часто я сам) знал , что предполагалось, да, я знал, что это была static ссылка.

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

6 голосов
/ 08 декабря 2008

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

public void method2()
{
    method1();
}

и

public void method2()
{
    this.method1();
}

Я не знаю многих людей, которые явно вызывают this при вызове другого метода в классе. Так что лично мне нравится вариант 1 - нет необходимости явно вызывать ClassName.

1 голос
/ 08 декабря 2008

Это чисто вопрос стиля, поэтому зависит от вашего вкуса.

Я предпочитаю первую версию. Поскольку 2 метода находятся в одном классе, я не считаю полезным повторять имя класса.

1 голос
/ 08 декабря 2008

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

Если вы чувствуете особую необходимость подчеркнуть, что это статический метод, не стесняйтесь сделать его Routines.method1() - но обычно я просто оставляю его как method1().

РЕДАКТИРОВАТЬ: я пытался придумать пример, где это имеет значение, используя перегрузку с params:

void CallMethod()
{
    Console.WriteLine("Calling Method()");
    Method();
    Console.WriteLine("Calling Test.Method()");
    Test.Method();
}

void Method(params string[] ignored)
{
    Console.WriteLine ("  Instance method called");
}

static void Method()
{
    Console.WriteLine ("  Static method called");
}

Это вызывает статический метод в обоих случаях. (Интересно, что добавление params к статическому методу дает немного запутанное сообщение об ошибке при использовании компилятора MS C # и полностью взрывает компилятор Mono - по крайней мере, версию, которую я использую.)

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

Короче, я не думаю, что смогу сделать это в конце концов: (

0 голосов
/ 08 декабря 2008

Это только вопрос личной пользы и читабельности кода, но вызов только «method1 ()» не эквивалентен «this.method», потому что оба метода в примере являются статическими, и вы не можете вызвать объект, который имеет не был создан С помощью статических методов вы не можете предвидеть, если существует экземпляр объекта в момент вызова метода, поэтому вы не можете использовать «this». «this» является только указателем на исполняемый объект, если он создан.

Чтобы ответить на вопрос:

Это полный синтаксический сахар - просто написать "method1 ()" вместо "Routines.method1 ()". Результат того, что компьютер выполняет / вызывает, то есть то, что компилятор сделал из кода, полностью одинаков.

0 голосов
/ 08 декабря 2008

Я делаю

public static method2() {
        Routines.method1();
}

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

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