0

我在很多地方都看到过这种模式,但从未见过它命名。

我更喜欢关于如何命名实现它的方法的建议,因为不同的人似乎使用不同的命名模式。

抱歉,我不记得任何库作为示例,但如果将其中一个用作您的答案的一部分,请命名它们。

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 的克隆。无论如何,起源并不重要,但在这里我们有两种非常知名的产品,完全符合我的描述......

http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/ext/typeinfo/JType.java

还有很多其他 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();
4

1 回答 1

1

首先,我认为这是一个可怕的模式。超类通常应该知道它的子类。

如果添加另一个子类会Produce怎样?您需要记住修改Produce. 容易出错。

不过,要回答您的问题,我会避免isFruit使用 ,因为用户可能希望它返回布尔值。如果被迫使用这种模式,我可能会使用getFruit()or asFruit()

于 2012-05-31T09:14:10.353 回答