在Java中使用Object.getClass()是不好的做法吗?

时间:2016-04-24 19:43:15

标签: java reflection rtti

我很清楚反射应该只作为最后的手段使用,即使您处于看起来应该依赖它的情况下,也可能意味着您的设计不好部分。这是一个非常强大的工具,只能极其谨慎地使用

我也知道 Java存储关于对象的一些管家信息,所以理论上用{确定对象的动态类型应该是一个相对便宜的操作{1}}(与没有此类内务处理数据的语言相比,至少便宜,例如C ++,RTTI需要昂贵的vtable查找)。

这是真的吗? 是否在Java 中被视为错误练习,以检查某个基础的某个是某个派生的 >使用Object.getClass()输入

3 个答案:

答案 0 :(得分:1)

当您尝试根据类型选择行为时,检查对象的运行时类型被认为是一种不好的做法:

if (animal instanceof Cat) { // or animal.getClass() == Cat.class
   ((Cat) animal).meow();
} else if (animal instanceof Dog) {
   ((Dog) animal).woof();
}

如果你这样做,你会忽略多态,因为它告诉你这样做:

animal.makeSound();

但是当你需要知道对象类型并使用.getClass()instanceof时 - 在使用反射,使用第三方库等时,可能存在许多情况。如果你不是黑客攻击多态,你很好。

答案 1 :(得分:1)

我会说这完全取决于情况,但我见过的大多数情况都是不好的做法。因为它通常用于替代正确的设计。

使用getClass的不良做法的一个例子就是这样:

public void method(SomeObject obj) {
    if(obj.getClass() == A.class) {
        // do something for A
    }
    if(obj.getClass() == B.class) {
        // do something for B
    }
    ...
}

为什么不委托给obj

obj.doSomething();

或者通过重载方法拆分案例:

public void method(A obj){...}
public void method(B obj){...}

关键是,它可以在很多时候避免,而且通常表明你在运行时工作,而不是在编译时完成。

答案 2 :(得分:0)

检查对象的类型并不是一种不好的做法。但是,Java中的反射仍然被认为是一项昂贵的操作。

最好不要使用getClass()来确定类型,而是使用instanceof检查某个类型是否与您要查找的内容相匹配。

例如:

if(theObject instanceof SomeBaseClassObject){
    //do something
}