Есть ли функциональная разница между явным использованием «MyClass.class» и использованием «this.class» для ссылки на класс, в котором вы сейчас находитесь?

Я видел следующие строки кода в различных классах Java, и мне интересно, какая польза от этого в каждом случае, кроме двух субъективных аргументов для каждого соответствующего примера: «более очевидно, о чем идет речь» и « он короче"?

1:

public class MyClass extends OtherClass
{
    private final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
...
}

или 2:

public class MyClass extends OtherClass
{
    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
...
}

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

Является ли это единственным соображением, которое я должен учитывать при принятии решения о том, что предпочтительнее, или есть ли другие технические причины, по которым явное имя может быть предпочтительнее, чем просто использование «это»? Например, может быть, можно сэкономить один или два цикла во время выполнения, чтобы не искать класс «this» при инициализации?

После ответа на аналогичный вопрос здесь, я пришел к выводу, что это не совсем соответствует этой ситуации, поскольку это не метод объекта, а, по сути, определение класса, о котором у меня вопрос, поэтому я не уверен, что принятый ответ «они становятся одинаковыми после компиляции» сохраняется в этой ситуации.

Обратите внимание, что у вас нет this в статическом контексте.

Gyro Gearless 19.06.2024 15:38

БОЛЬШАЯ разница: this.class не должно быть действительным (даже в нестатическом контексте) — вы имеете в виду this.getClass() или просто getClass()? (JLS 15.8.2. Литералы классов)

user85421 19.06.2024 15:38

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

Alan Hay 19.06.2024 15:42

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

schnejj 19.06.2024 15:51

если вопрос о разнице между method() и this.method(). ответ: «никакой разницы (но для немного более длинного исходного кода)»

user85421 19.06.2024 15:54

Ах да, я искал вопрос с такой разницей, и здесь уже есть ответ: stackoverflow.com/questions/33779127/…

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

Ответы 1

Ответ принят как подходящий

Поскольку ваш вопрос сформулирован о .class и this.getClass() в целом, разница действительно есть! Не для статических переменных, как в приведенном вами примере (поскольку мы не можем использовать this в статическом контексте), а для переменных, например, есть случай, когда это имеет значение: наследование.

Если вы используете this.getClass(), он может относиться к дочернему классу, а не к литералу класса, который всегда будет одним и тем же. Итак, что-то вроде:

public class ParentClass {
    public Class instanceKeywordClass = ParentClass.class;
    public Class instanceMethodClass = this.getClass();
}
    
public class ChildClass extends ParentClass {
        
}

Для переменной instanceMethodClass будут разные результаты в зависимости от дочернего класса:

Parent parent = new ParentClass();
System.out.println(parent.instanceKeywordClass); // -> class ParentClass
System.out.println(parent.instanceMethodClass);  // -> class ParentClass
        
ChildClass child = new ChildClass();
System.out.println(child.instanceKeywordClass);  // -> class ParentClass
System.out.println(child.instanceMethodClass);   // -> class ChildClass

Интересно, поэтому после прочтения вашего ответа и дальнейшего исследования я сделал вывод, что в основном для моего варианта использования журналов я бы предпочел использовать явный путь Name.class по причинам, изложенным в принятом ответе на следующий вопрос: stackoverflow.com/questions/6653520/… потому что Bar, расширяющий Foo, будет одновременно регистрироваться в Bar logger... а это не то, чего я хочу, как программист, пытающийся отладить программу.

schnejj 19.06.2024 17:10

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