【问题标题】:Is it bad practice to use Object.getClass() in Java? [closed]在 Java 中使用 Object.getClass() 是不好的做法吗? [关闭]
【发布时间】:2016-08-18 02:31:03
【问题描述】:

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

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

真的是这样吗? 是否被认为是 不好在 Java 中的实践检查某个基础的对象t是否是某个派生的输入使用getClass()?

【问题讨论】:

    标签: java reflection rtti


    【解决方案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】:

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

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

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

      animal.makeSound();
      

      但在很多情况下,您需要知道对象类型并使用 .getClass()instanceof - 在使用反射、使用第三方库等时。如果您不是在破解多态性,您'很好。

      【讨论】:

        【解决方案3】:

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

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

        例如:

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

        【讨论】:

        • instanceof 也为从类SomeBaseClassObject 派生的类的实例返回true,因此不一样。
        • 正确,但您可以使用它来检查您关心的父/子层次结构中的级别。如果你想验证它是一个子对象,那么 instanceof 就在上面。您可以根据需要缩小范围。
        • 正确,但可以使用getClass() 来检查实例是否完全属于您要查找的类型。
        • 从来没有说过你不能。我只是说最好使用 instanceof :)
        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 2020-07-26
        • 2019-05-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        相关资源
        最近更新 更多