Вызывающий метод по сравнению с 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();

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

Ответы 6

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

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

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

Короче, не думаю, что все-таки смогу :(

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

basszero 08.12.2008 16:10

Я не упоминал о переопределении. Я упомянул перегрузку.

Jon Skeet 08.12.2008 16:13

Джон: Я бы хотел увидеть пример :)

Eyvind 08.12.2008 16:24

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

basszero 08.12.2008 17:10

@basszero: Сложность в моем пытаться заключалась в том, что у этих двух методов разные сигнатуры, но они оба совпадают. Впрочем, это уже в спецификации, судя по всему, однозначно.

Jon Skeet 08.12.2008 17:28

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

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

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

public void method2()
{
    method1();
}

и:

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

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

Только не используйте this.method1 (), если оба метода статические. Пока он работает, вы получите предупреждение компилятора.

Powerlord 08.12.2008 17:31

@Р. Бемроуз - не пойдет, получите компилятор ошибка. Вы не можете вызвать статический метод с это.

Yuval Adam 08.12.2008 17:38

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

James Schek 08.12.2008 19:57
Ответ принят как подходящий

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

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

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

это не предупреждение при использовании статического члена в нестатическом контексте? здесь method2 () - это статический контекст ... поэтому я думаю, что предупреждения не будет ...

Vinze 08.12.2008 17:08

@Vinze: Я тоже видел это сообщение. Скорее всего, вы правы, что в данном конкретном случае это сообщение не будет отображаться. Однако, поскольку вопрос касался стиля и почему, я немного обобщил (и, возможно, недостаточно внимательно прочитал пример ;-))

Ken Gentle 08.12.2008 17:17

полностью согласен, и я использую «это». а также - ясность - это все

annakata 08.12.2008 17:28

Это (каламбур :)) - дело стиля и уже подробно обсуждалось по многим вопросам ...

Yuval Adam 08.12.2008 17:40

Вы также используете имя класса при обращении к константе? то есть Classname.MY_PUBLIC_FINAL_VALUE и Classname.MY_PRIVATE_FINAL_VALUE изнутри Classname?

James Schek 08.12.2008 19:54

Да, очень часто в «публичном» деле. В частном случае не всегда, потому что соглашение об именах (ALL_UPPER) передает намерение. Введение статического импорта в Java заставило меня пересмотреть эту практику для общедоступных констант / методов, но до сих пор я все еще следую тому, что я описал.

Ken Gentle 08.12.2008 20:11

я делаю

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

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

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

mtruesdell 08.12.2008 17:26

Готов поспорить, у нас будет меньше ошибок во всех программах, если компилятор Java / C# заставит нас добавить «это». / "Класс." для всех учеников; все остальное местное.

Dennis C 09.12.2008 16:28

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

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

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

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