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

在Java中使用Object.getClass()是一种不好的做法吗?,java,reflection,rtti,Java,Reflection,Rtti,我清楚地意识到,反射只能作为最后手段使用,即使您处于似乎应该依赖它的情况下,也可能意味着您的设计不好。这是一个非常强大的工具,使用时必须非常小心 我还知道Java存储了一些关于对象的内务管理信息,因此从理论上讲,使用object.getClass()(至少与没有这种管家数据的语言相比,例如C++,在RTI中需要昂贵的VTD查找)。 这是真的吗?使用getClass()检查某个基的对象t是否是特定的派生类型在Java中是否被认为是不好的做法?检查对象的类型并不被认为是一种不好的做法。但是,Java

我清楚地意识到,反射只能作为最后手段使用,即使您处于似乎应该依赖它的情况下,也可能意味着您的设计不好。这是一个非常强大的工具,使用时必须非常小心

我还知道Java存储了一些关于对象的内务管理信息,因此从理论上讲,使用
object.getClass()
(至少与没有这种管家数据的语言相比,例如C++,在RTI中需要昂贵的VTD查找)。
这是真的吗?使用
getClass()检查某个基的对象t是否是特定的派生类型在Java中是否被认为是不好的做法

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

与其使用
getClass()
来确定类型,不如使用
instanceof
来检查类型是否与您要查找的匹配

例如:

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

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

与其使用
getClass()
来确定类型,不如使用
instanceof
来检查类型是否与您要查找的匹配

例如:

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

在尝试基于类型选择行为的情况下,检查对象的运行时类型被认为是一种不好的做法:

if (animal instanceof Cat) { // or animal.getClass() == Cat.class
   ((Cat) animal).meow();
} else if (animal instanceof Dog) {
   ((Dog) animal).woof();
}
如果您这样做,您将忽略多态性,因为它告诉您应该这样做:

animal.makeSound();

但是,在很多情况下,您需要知道对象类型并使用
.getClass()
instanceof
-在使用反射、使用第三方库等时。如果您没有攻击多态性,您就可以了。

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

if (animal instanceof Cat) { // or animal.getClass() == Cat.class
   ((Cat) animal).meow();
} else if (animal instanceof Dog) {
   ((Dog) animal).woof();
}
如果您这样做,您将忽略多态性,因为它告诉您应该这样做:

animal.makeSound();

但是,在很多情况下,您需要知道对象类型并使用
.getClass()
instanceof
-当使用反射、使用第三方库等时。如果你不攻击多态性,你就没事。

我会说这完全取决于情况,但我看到的大多数情况都是不好的实践情况。因为它通常被用来替代正确的设计

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

关键是,它在很多时候都可以避免,而且它通常是在运行时进行工作的标志,而不是在编译时进行工作。

我会说这完全取决于情况,但我看到的大多数情况都是不好的实践情况。因为它通常被用来替代正确的设计

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

关键是,它在很多时候都可以避免,而且它通常是您在运行时执行工作的一个标志,可以在编译时执行。

instanceof
对于从类
SomeBaseClassObject
派生的类的实例也返回
true
,因此它是不同的。正确,但您会使用它检查您所关心的父/子层次结构中的级别。如果要验证它是否为子对象,请在此基础上执行instanceof。您可以根据需要缩小范围。正确,但可以使用
getClass()
检查一个实例是否正是我们要查找的类型。从来没有说过你不能。我只是说最好使用instanceof:)
instanceof
返回
true
作为从类
SomeBaseClassObject
派生的类的实例,因此它是不同的。正确,但是您可以使用它来检查您关心的父/子层次结构中的级别。如果要验证它是否为子对象,请在该对象上执行instanceof。您可以根据需要缩小范围。正确,但是可以使用
getClass()
检查实例是否与您要查找的类型完全相同。从未说过您不能。我刚才说最好使用instanceof:)