询问 unrelated question我有这样的代码:
public boolean equals(Object obj)
{
if (this == obj)
trả về giá trị đúng;
if (obj == null)
trả về false;
if (getClass() != obj.getClass())
trả về false;
// Check property values
}
我收到一条评论,声称这不是最优的,而是(如果我理解正确的话)应该这样做:
public boolean equals(Object obj)
{
if (this == obj)
trả về giá trị đúng;
else if (obj == null)
trả về false;
else if (getClass() != obj.getClass())
trả về false;
// Check property values
}
由于 return 语句,我真的不明白为什么它们中的任何一个应该比另一个更有效或更快。给定一个特定的对象,就我所见,这两种方法都必须进行相同数量的检查。并且由于 return 语句,它们中的任何一个都不会运行额外的代码。
我在这里遗漏了什么吗?有什么关系吗?是否有一些编译器优化或发生了什么?
我知道这是微优化,我很可能会坚持第一种方式,因为我认为所有 if 都在同一位置时看起来更简洁。但我无能为力;我很好奇!
这两种情况生成的字节码是相同的,所以这纯粹是风格问题。
我生成了两个方法 e1
Và e2
并且都生成了这个字节码(使用 javap -v
读取):
public boolean e1(java.lang.Object); Code: Stack=2, Locals=2, Args_size=2 0: aload_0 1: aload_1 2: if_acmpne 7 5: iconst_1 6: ireturn 7: aload_1 8: ifnonnull 13 11: iconst_0 12: ireturn 13: aload_0 14: invokevirtual #25; //Method java/lang/Object.getClass:()Ljava/lang/Class; 17: aload_1 18: invokevirtual #25; //Method java/lang/Object.getClass:()Ljava/lang/Class; 21: if_acmpeq 26 24: iconst_0 25: ireturn
我省略了我在之后放置的代码以使其编译。
Tôi là một lập trình viên xuất sắc, rất giỏi!