Я видел следующие строки кода в различных классах 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.class не должно быть действительным (даже в нестатическом контексте) — вы имеете в виду this.getClass() или просто getClass()? (JLS 15.8.2. Литералы классов)
«Это единственное, что я должен учитывать при принятии решения». Ну, когда ссылка статична, компиляция не выполняется, поэтому у вас нет выбора.
Упс, вы все правы, я, должно быть, неправильно припомнил, что видел это таким образом. Вероятно, без квалификатора статического поля... В этом случае это действительно аналогичная причина, связанная со связанным вопросом о stackoverflow в сообщении, верно?
если вопрос о разнице между method() и this.method(). ответ: «никакой разницы (но для немного более длинного исходного кода)»
Ах да, я искал вопрос с такой разницей, и здесь уже есть ответ: stackoverflow.com/questions/33779127/…




Поскольку ваш вопрос сформулирован о .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... а это не то, чего я хочу, как программист, пытающийся отладить программу.
Обратите внимание, что у вас нет
thisв статическом контексте.