【问题标题】:Checking classes with if statement in Java在 Java 中使用 if 语句检查类
【发布时间】:2014-04-08 21:09:48
【问题描述】:

我想知道是否有一种方法可以检查对象是哪个类的实例的 if 语句。我需要这样的东西:

if(object.getClass().equals("class Circle")) return object.radius;

这在 Java 中可行吗?

【问题讨论】:

标签: java class if-statement


【解决方案1】:

instanceof 运算符应该可以解决问题:

if (object instanceof Circle ) {
    return ((Circle) object).radius;
}

【讨论】:

  • 好答案。如果您不将对象投射为圆形,您将无法从中获取半径。
  • 谢谢,这正是我想要的!
  • 请注意,这是您正在寻找的,但可能会导致错误/不干净的代码。
【解决方案2】:

使用实例

if(object instanceof Circle)

【讨论】:

    【解决方案3】:

    您要查找的内容大致是instanceof。然而,这种表述暴露了对强类型语言中的面向对象编程的内在缺乏理解:

    //Start with no information about 'object'
    if(object instanceof Circle) { //Figure out if it is a Circle
      return object.radius; //If so, do something
    }
    

    实际上,在 Java 中,您应该已经知道要处理哪些函数,至少在大多数情况下是这样:

    public void getRadius(Object o) {
      //Any old object may not even be related to a geometric thing; o could be a network socket!
    }
    
    public void getRadiusBetter(Shape s) {
      //Shapes may or may not have a radius, but at least we are talking about shapes
    }
    
    public void getRadiusBest(Circular c) {
      //By definition, c would have the state for the object's radius
    }
    

    例如,我们可以将 Circular 定义为:

    public interface Circular {
      public double getRadius();
    }
    

    这保证了任何 Circular 对象都能够返回一个半径。通常,您希望以这种方式制定代码,利用强类型,而不是假设没有关于您正在处理的对象的信息(如在 Javascript 或其他弱类型语言中)。否则,您可能会陷入制作许多 if 语句和复杂逻辑的困境,以确定您是否甚至可以针对您正在处理的对象提出适当的问题。在 Java 中,您可以随意进行合理的检查,但始终尽可能具体地了解您的对象。

    记住,这个:

    f(x:TypeA) => y:TypeB
    

    可以保证在强类型语言中,但不能在弱类型语言中:

    public TypeB f(TypeA x) { ... }
    

    在 JS 中,你依赖于函数做它所说的。在 Java 中,如果失败则不会编译。

    【讨论】:

    • 谢谢你的好回答,但我仍然是少量的Java类,我什至从未使用过接口。我确信你想说的是真的,我应该利用多态性而不是使用一堆 if 语句来使代码更干净、更容易管理,但现在我正试图完成一个编程作业不是很清楚它需要我做什么,所以我的代码有点乱。我想我需要重新开始编写干净且类似 OO 的代码,但我真的没有时间。无论如何,再次感谢您的回答
    • 我只想说,如果你发现你的代码一团糟,那是有原因的。确保你在下一个 - 甚至这个 - 去定位原因。利用强类型将减少您的调试时间。
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多