【发布时间】:2021-06-16 13:45:41
【问题描述】:
我已经编写了这个“CoreException”Exception 子类。我似乎在构造函数中有三个选项,它们的行为都相同,因为它们都引用同一个对象。
*注意:问题是关于编译器和三个不同源代码选项可能的运行时差异。构造的 Object 可以是任何类。
public class CoreException extends Exception {
private final Class<?> sourceClass;
private final Method sourceMethod;
public CoreException(@NotNull Method method, @NotNull Throwable thr) {
super("this text is irrelevant", thr);
this.setStackTrace(thr.getStackTrace());
this.sourceMethod = method;
this.sourceClass = this.sourceMethod.getDeclaringClass();
}
public Class<?> getSourceClass() { return sourceClass; }
public Method getSourceMethod() { return sourceMethod; }
}
Class<?> sourceClass 对象的构造似乎有三个相同的选项:
this.sourceClass = this.sourceMethod.getDeclaringClass();
this.sourceClass = sourceMethod.getDeclaringClass();
this.sourceClass = method.getDeclaringClass();
是否有充分的理由使用其中一个而不是其他的,可能是因为性能、可靠性/弹性等方面的边际提升?
或者编译器只是简单地将所有这三个变成完全相同相同的结果?
【问题讨论】:
-
它们都是同一个对象。
-
是的。这就是为什么我想知道在这种情况下是否还有其他原因使用一种语法而不是另一种语法。也许对编译器/ jvm 有非常深刻理解的人可能会建议将削减几纳秒或其他东西。 :) (或者编译器只是最终编译成相同的最终状态?)
-
因为我的意思是前两个不是对作为 arg 提供的对象实例的克隆的引用,第三个是对作为 arg 提供的特定对象实例的引用?
-
作为第一步,您可以查看生成的字节码。即使你不明白其中的任何一个,你也应该能够看到是否有差异。
标签: java constructor compiler-optimization