首页 / JAVA / 带有通用类的Java枚举
带有通用类的Java枚举
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了带有通用类的Java枚举,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2945字,纯文字阅读大概需要5分钟。
内容图文
![带有通用类的Java枚举](/upload/InfoBanner/zyjiaocheng/784/25825dbd5063466fac8aef78b4350760.jpg)
我正在从解释的世界转换齿轮,我试图复制我在传递中使用的模式,但在Java中取得了巨大的成功.
缺点是我正在制作一个自定义DAO(不使用Hibernate或类似的东西……最终处理不同的数据库引擎(SQL和NoSQL)将是通用的.为了突破我只是使用MySQL / Prepared Statementments .
我想基本上定义一个DataMapper对象,负责将记录的字段映射到数据库中的字段.我试图封装任何冗余逻辑,以实现将类型转换为数据库期望格式的实现细节.在DataMapper中,我试图利用枚举列出字段:
public abstract class AbstractDataMapper<X> {
public static abstract class Field<Y> {
protected String name;
public Field(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public abstract void setValue(PreparedStatement stmt, int parameterIndex, Y value)
throws SQLException;
public abstract Y getValue(ResultSet rset)
throws SQLException;
}
public static class IntegerField extends AbstractDataMapper.Field<Integer> {
public IntegerField(String name) {
super(name);
}
@Override
public void setValue(PreparedStatement stmt, int parameterIndex,
Integer value) throws SQLException {
stmt.setInt(parameterIndex, value.intValue());
}
@Override
public Integer getValue(ResultSet rset) throws SQLException {
return new Integer(rset.getInt(this.name));
}
}
}
public class UserDataMapper extends AbstractDataMapper<UserDataRecord>{
public static enum Field {
entryId(new AbstractDataMapper.IntegerField("entryid"));
AbstractDataMapper.Field<?> field = null;
Field(AbstractDataMapper.Field<?> field) {
this.field = field;
}
public AbstractDataMapper.Field<?> getField() {
return this.field;
}
public String getName() {
return this.field.getName();
}
}
显然,我试图将示例截断为有意义的部分.
用于执行此操作的客户端代码
public int insert(UserDataRecord user) {
...
final String query =
"INSERT INTO users SET "
+ UserDataMapper.Field.entryId.getName() + " = ? ";
stmt = conn.prepareStatement(query);
UserDataMapper.Field.entryId.getField()
.setValue(stmt, 1, user.getEntryId());
}
我遇到的问题是最后一行.我试图使用与entryId枚举关联的泛型对象来使用它的特殊setValue函数,该函数处理将Integer转换为正确的格式.我的IDE给了我以下错误:
AbstractDataMapper.Field类型中的方法setValue(PreparedStatement,int,capture#13-of?)不适用于参数(PreparedStatement,int,Integer).
我相信我可以进入一系列疯狂的类型转换……但在那时,它可能会更容易暴露翻译细节.
有关实现此功能或修改此模式的任何想法更好吗?
解决方法:
枚举不能是通用的,所以你的情况有问题.
一种更简单的铸造方式
public static enum Field {
public <T> AbstractDataMapper.Field<T> getField() {
return (AbstractDataMapper.Field<T>)this.field;
}
// usage
UserDataMapper.Field.entryId.<Integer>getField()
更大的问题是,在这里使用枚举有什么意义?使用一些静态公共最终字段会简单得多.
public class UserDataMapper extends AbstractDataMapper<UserDataRecord>{
public interface Fields {
IntegerField entryId = new IntegerField("entryid"));
----
final String query =
"INSERT INTO users SET "
+ UserDataMapper.Field.entryId.getName() + " = ? ";
stmt = conn.prepareStatement(query);
UserDataMapper.Field.entryId
.setValue(stmt, 1, user.getEntryId());
内容总结
以上是互联网集市为您收集整理的带有通用类的Java枚举全部内容,希望文章能够帮你解决带有通用类的Java枚举所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。