内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我有一个创建得很糟糕的容器对象,它将不同java类型的值(字符串、布尔值等)放在一起。
public class BadlyCreatedClass { public Object get(String property) { ...; } };
我们用这种方法提取值
String myStr = (String) badlyCreatedObj.get("abc"); Date myDate = (Date) badlyCreatedObj.get("def");
我被迫使用这个对象编写一些新代码,并且我试图看看是否有干净的方法来实现这一点。更具体地说,下面哪种方法是首选的?
显式铸造
String myStr = (String) badlyCreatedObj.get("abc") Date myDate = (Date) badlyCreatedObj.get("def");
使用通用强制转换
public <X> X genericGet(String property) { } public String getString(String property) { return genericGet(property); } public Date getDate(String property) { return genericGet(property); }
使用Class.cast
<T> T get(String property, Class<T> cls) { ; }
因为所有选项都涉及类型转换,因此它们在某种程度上都是“不安全的”,并且可能会在ClassCastExceptions
报错。
我绝对推荐使用助手方法,例如getString()
,,,getDate()
对于通常存储在此对象中的常见类型。这些方法对于所有三个选项都很有用,因为对象的用户必须编写的代码减少了。
但是,仍然需要一种从对象接收“不寻常”类型的方法。为此,我将使用显式强制转换或类强制转换。原因是我认为这两种方式是大多数人使用的方式。即使泛型方法调用可以正常工作,我认为方法调用如下obj.genericGet<String>("myproperty");
不是每个java开发人员都知道的。这在实践中是很少见到的。
个人是会添加一个getObject()
方法,即使我不喜欢将强制转换类型移动到对象的用户。这样做的好处是,将有一个一致的接口,如果我看到这样的方法,我就会这样想getString()
或getDate()
...