我有一套操作。每个操作都是由 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/