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
类子类化。成千上万的程序员说,“不,我再也不需要添加这个类的另一个子类了!”…结果却错了。如果问题的参数发生变化,并且您的上述方法实际上不可扩展,那么编写可以在以后扩展的代码总是很重要的。