优雅的Java类颓废

Ben*_*rns 0 java casting

设A是AB和AC的超类。给定一个方法:

public void handleStuff(A someObject) {
  if(someObject instanceof AB){ 
     ((AB)someObject).someABFunction();
  } else if(someObject instanceof AC) {
     ((AC)someObject).someACFunction();
  }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这里的双重检查/铸造操作;有没有其他方法可以在不首先检查类型然后进行转换的情况下进行编码?我知道我可以使用两个以 AB 或 AC 作为参数的重载函数来完成此操作,但我正在寻找更少的代码,而不是更多:-),例如:

public void handleStuff(A someObject) {
  if(someObject instanceof AB){ 
     someObject.someABFunction(); // it is already clear that this is AB
  } else if(someObject instanceof AC) {
     someObject.someACFunction(); // it is already clear that this is AC
  }
}
Run Code Online (Sandbox Code Playgroud)

mar*_*ran 7

在 Java 16 及更高版本中,您可以使用模式匹配来避免强制转换。像这样:

public void handleStuff(A someObject) {
  if (someObject instanceof AB ab) { 
     ab.someABFunction();
  } else if (someObject instanceof AC ac) {
     ac.someACFunction();
  }
}
Run Code Online (Sandbox Code Playgroud)

在 Java 17 及更高版本中,您可以启用 switch 表达式中模式匹配的预览功能,以进一步缩短它。使用该功能,您可以执行以下操作:

public void handleStuff(A someObject) {
  switch (someObject) {
    case AB ab -> ab.someABFunction();
    case AC ac -> ac.someACFunction();
    default -> {}
  }
}
Run Code Online (Sandbox Code Playgroud)