Java 建议命名模式,该模式在op失败时尝试强制转换并返回null

Java 建议命名模式,该模式在op失败时尝试强制转换并返回null,java,naming-conventions,interface-design,Java,Naming Conventions,Interface Design,我在很多地方见过这种模式,但从未见过它的名字 我更多的是想知道如何命名实现它的方法,因为不同的人似乎使用不同的命名模式 对不起,我想不起任何图书馆作为例子,但如果使用一个作为你的答案的一部分,请命名它们 public class Produce{ package private Produce(){}; Fruit isFruit(){ return null; } Veg isVeg(){ return null; } } public

我在很多地方见过这种模式,但从未见过它的名字

我更多的是想知道如何命名实现它的方法,因为不同的人似乎使用不同的命名模式

对不起,我想不起任何图书馆作为例子,但如果使用一个作为你的答案的一部分,请命名它们

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;
   }
}
附加的

@路易斯瓦瑟曼

首先,通过将产品包装私有化来限制产品子类型的数量。通过包含2个isXXX方法,我说明了一个事实:只有2个子类,这比执行instanceof检查更好。也许只是我,但这种方法也意味着在其他代码或上面的代码中没有强制转换,这一定是件好事,对吗

另外,当搜索或查询失败时,从方法返回空列表是否与在尝试将Veg强制转换为水果时返回null以标记操作isFruit()失败相同

我在GWT的JType中找到了一个快速示例,我相信它是eclipsejdt的克隆。不管怎么说,产地并不重要,但这里我们有两个非常熟悉的产品,正是我所描述的

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

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

如果您添加另一个子类
product
?您需要记住修改
生成
。容易出错


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

如果必须这样做,
instanceof
通常是一种方法。但通常有更好的方法。@aioobe根据我的经验,asXXX总是用来建议一个始终有效且从不返回null或throws的cast/视图。这就是启发我去问的原因。@aioobe我已经编辑了q,以显示product有有限数量的子类。这并不是免费的,你举的例子是GWT在内部处理Javascript的动态类型时所必须做的肮脏笨拙的黑客行为的例子。除非您正在研究GWT的内部结构,否则这是一个非常糟糕的例子。即使您的类是包私有的,这是一个坏习惯的原因是您可能希望以后添加新的子类,而不是其他程序员可能会将您的
product
类子类化。成千上万的程序员说,“不,我再也不需要添加这个类的另一个子类了!”…结果却错了。如果问题的参数发生变化,并且您的上述方法实际上不可扩展,那么编写可以在以后扩展的代码总是很重要的。