我在很多地方都看到过这种模式,但从未见过它命名。
我更喜欢关于如何命名实现它的方法的建议,因为不同的人似乎使用不同的命名模式。
抱歉,我不记得任何库作为示例,但如果将其中一个用作您的答案的一部分,请命名它们。
public class Produce{
package private Produce(){};
Fruit isFruit(){
return null;
}
Veg isVeg(){
return null;
}
}
public class Veg extends Produce {
package private Veg(){};
Veg isVeg(){
return this;
}
}
public class Fruit extends Produce {
package private Fruit(){};
Fruit isFruit(){
return this;
}
}
额外的
@LouisWasserman
首先,通过将其 ctor 包设为私有来限制 Produce 的子类型的数量。通过包含 2 个 isXXX 方法,我说明了一个事实,即只有 2 个子类,这比进行 instanceof 检查要好。也许只有我,但是,这种方法也意味着在其他代码或上述代码中没有强制转换,这一定是件好事,对吧?
当搜索或查询失败时,也不会从方法返回一个空列表,这与在尝试将 Veg 转换为 Fruit 时返回 null 以标记操作 isFruit() 失败类似吗?
我在 JType 中的 GWT 中找到了一个快速示例,我相信它是 Eclipse JDT 的克隆。无论如何,起源并不重要,但在这里我们有两种非常知名的产品,完全符合我的描述......
还有很多其他 isXXX 尝试强制转换或返回 null,我在下面粘贴了一些。
/**
* Returns this instance as a {@link JAnnotationType} if it is an annotation
* or <code>null</code> if it is not.
*/
JAnnotationType isAnnotation();
JArrayType isArray();
JClassType isClass();
JClassType isClassOrInterface();
/**
* Returns this instance if it is an enumeration or <code>null</code> if it is
* not.
*/
JEnumType isEnum();
JGenericType isGenericType();