我知道这听起来有点疯狂,但在这里.我有一个代表一组不同属性的枚举类型.每个都可能只是一个字符串,但强制执行某种类型的安全性会很好.因此,基本上检查与每个枚举值关联的类型,如果不匹配则抛出异常.我想这可以通过实例来完成,但我很好奇是否有另一种方法可以在没有instanceof的情况下执行此操作.我知道这可能不可能,但我很好奇.
编辑,我创建了一个新的例子,我认为这说明了我更好的问题:
public class CmisProperties {
public enum CmisPropEnum{
Name (PropertyIds.NAME, new String() ),
CreatedBy (PropertyIds.CREATED_BY, new String() ),
CreationDate (PropertyIds.CREATION_DATE, new Date() ),
LastModifiedBy (PropertyIds.LAST_MODIFIED_BY, new String() ),
LastModificationDate (PropertyIds.LAST_MODIFICATION_DATE, new Date() ),
ChangeToken (PropertyIds.CHANGE_TOKEN, new String() );
private String propId;
CmisPropEnum ( String propId , Object templateObject ){
this.propId = propId;
}
public <T> String getPropId(){
return propId;
}
}
private Map<CmisPropEnum, Object> propertyMap = new HashMap<CmisPropEnum, Object>();
public Object getProperty(CmisPropEnum propEnum){
return propertyMap.get(propEnum.getPropId());
}
public void setProperty( CmisPropEnum propEnum, Object value){
propertyMap.put(propEnum, value);
}
}
Run Code Online (Sandbox Code Playgroud)
后来我希望这发生:
CmisProperties props = new CmisProperties();
/* This causes a compile time exception */
props.setProperty(CmisPropEnum.CreationDate, "foobar" );
/* This I want to be ok, because the type matches that in the enum */
props.setProperty(CmisPropEnum.CreationDate, new Date() );
Run Code Online (Sandbox Code Playgroud)
查看 Josh Bloch 的《Effective Java》第 29 条,其中他描述了一种“类型安全的异构容器”,他将其称为“Favorites”。API 是
public class Favorites {
public <T> void putFavorite(Class<T> type, T instance);
public <T> T getFavorite(Class<T> type);
}
Run Code Online (Sandbox Code Playgroud)
我认为它会满足您的需求(可能会更改名称???)。你可以打电话
favorite.putFavorite(Name.getClass(), "Fred");
favorite.putFavorite(ADate.getClass(), new Date(1234));
Run Code Online (Sandbox Code Playgroud)
然后
Date date = favorite.getFavorite(ADate.getClass());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |