java - java 中向下转型的良好实践

标签 java

我有一套操作。每个操作都是由 2 个步骤组成的序列。因此,我有一个执行这两个步骤的基类,所有操作都扩展该基类并提供这两个步骤的实际实现。例如。

class Base {
    Step1 step1;
    Step2 step2;

    B execute() {
        A a = step1.perform();
        B b = step2.perform(a);
    }

    //Set methods...
}

这里的 Step1 和 Step2 是接口(interface),我们可以更改它们的实现来执行不同的操作。

我有以下问题:

  • step2 的每个实现都将 A 的实例作为输入,它也可以包含 A 的派生类型。所以我需要进行向下转换。在这种情况下可以进行向下转型吗?还是有更好的方法来实现这一目标?
  • 第 2 步的某些实现可能不会返回任何值。如果我们有一个仅用于类型层次结构的空类并且其他类扩展该类,可以吗?

最佳答案

问题 1

是的,没关系。每个扩展类 A 或实现接口(interface) A(无论 A 是什么)的类都将是“A 的实例”。因此,将其传递给需要 A 类型对象的方法是完全可以的。无需担心。这就是您应该如何使用接口(interface)和继承。同一父类(super class)有不同种类的“特化”。

问题 2

这是你的API设计的问题。如果您希望此方法可以返回 null,您可以这样做。但你应该很好地记录它!

Java 8 中的一个非常新的可能性是所谓的可选。如果某个方法可能返回 null 并且您希望强制程序员牢记这一点,则可以使用它们。这将是最干净的(也是推荐的)方式。您可以在 http://java.dzone.com/articles/optional-java-8-cheat-sheet 找到示例和说明。 。基本上你会说类Step2的方法perform将返回一个Optional而不是类型:

interface Setp2 {
    public Optional<B> perform(A a);
}

// the optional will wrap the actual result which could be null
// since Java 8
Optional<B> b = step2.perform(a);

关于java - java 中向下转型的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24024023/

相关文章:

java - Eclipse 和 Android Activity 中的错误似乎无法弄清楚

java - Google App Engine Java 文本搜索 API 在字符串搜索中的工作方式与 python 不同

java - Db2 表的 DDL 生成

java - 如何检查是否有任何应用程序在 Android 设备上播放任何类型的媒体?

java - 用户输入验证: date input

java - 在接口(interface)中创建两个通用参数

java - Android:代码父类(super class)必须调用的位置

java - RecyclerView 在 DrawerLayout 关闭时获得焦点

java - 如何使用 Maven 构建 SonarLint 源代码?

java - 使用 java 正则表达式而不是引号替换单词