Вызывающий метод Versus class.method

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

public class Routines {

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

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

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

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

public static method2() {

        method1();

}

ИЛИ ЖЕ

public static method2() {

        Routines.method1();

}

6 ответов

Решение

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

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

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

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

public void method2()
{
    method1();
}

а также:

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

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

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

Если вы чувствуете особую необходимость подчеркнуть, что это статический метод, не стесняйтесь сделать это 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 - по крайней мере, версию, которую я использую.)

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

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

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

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

Я делаю

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

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

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

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

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

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