2016-04-24 64 views
0

我很清楚反射应该只能作为最后的手段,即使您处于似乎您应该依赖的情况下,也可能意味着您的设计不好。这是一个非常强大的工具,只能极其谨慎地使用在Java中使用Object.getClass()是不好的做法吗?

我也知道,的Java存储一些家政信息有关对象,所以理论上它应该是一个相对便宜的操作以确定动态类型的对象与Object.getClass()(至少便宜相比,没有这样的语言管家数据,例如C++,其中RTTI需要昂贵的vtable查找)。

这是真的吗? 难道认为实践中的Java 检查一个objec一些基本的吨一定使用getClass()派生

回答

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 - 使用反射,使用第三方库等。如果您没有黑客入侵多态,那就没问题。

0

检查对象的类型并不是一个坏习惯。但是,Java中的反思仍然被认为是一项昂贵的操作。

代替使用getClass()来确定类型,最好使用instanceof来检查类型是否与您正在查找的内容匹配。

例如:

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

'instanceof'对于派生自类SomeBaseClassObject''的类的实例返回'true',所以它不一样。 – Martin

+0

正确,但您会用它来检查您关心的父级/子级别中的级别。如果你想验证它是一个子对象,那么instanceof就是这个。您可以根据需要缩小范围。 – pczeus

+0

正确,但可以使用'getClass()'来检查一个实例是否是查找类型的_exactly_。 – Martin

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){...} 

问题是,它可以避免很多的时间,这通常表明您在运行时正在进行工作,而这可以在编译时完成。

相关问题