【问题标题】:Is there any reason to prefer 'ClassName.class' over 'this.getClass()' to get an instance of the class object? [duplicate]是否有任何理由更喜欢 'ClassName.class' 而不是 'this.getClass()' 来获取类对象的实例? [复制]
【发布时间】:2016-05-03 19:22:59
【问题描述】:

我在查看我工作中的一些 Java 代码时注意到,当我们在每个类中初始化日志框架时,我们会看到类似的内容:

private final Logger log = Logger.getLogger(Foo.class);

这让我想到,我们有什么理由使用Foo.class 而不是:

private final Logger log = Logger.getLogger(this.getClass());

这仅仅是一种偏好,还是有实际理由偏爱其中一种?

编辑:最初的代码 sn-ps 引用了静态成员,显然不会编译。

【问题讨论】:

  • 如果您在非静态上下文中,您可以使用其中任何一个,但它们属于不同类型:Foo.class 属于Class<Foo> 类型; aFoo.getClass() 的类型为 Class<? extends Foo>。
  • 我的错,我复制并粘贴了日志代码,并没有注意到其中的static。那不是故意的。我将编辑原始问题。
  • 副本解释了两个表达式之间的区别。还有很多其他关于记录器的帖子:here、here 等等。

标签: java


【解决方案1】:

忽略关于静态上下文的部分(这是完全正确的——让我们假设你在那些初始化器中的表达式被移动到实例方法中)——当从子类调用时,带有 this.getClass() 的方法将产生非常不同的结果!

如果您想要 Foo 的类对象,请始终使用第一个版本。

如果您想要调用者的类(Foo 的子类),请使用第二个版本。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2011-03-18
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多