【问题标题】:How to persist enum const in ormlite as a interface type?如何将 ormlite 中的 enum const 保留为接口类型?
【发布时间】:2020-05-31 16:09:09
【问题描述】:

我有一个枚举,它实现了一个接口。这个接口的目的只是在多个枚举之间创建一个绑定,以便我以后可以实现一个插件系统。 (This post 可能会稍微清楚一点。)

我的图书馆枚举是这样的:

public interface Resource extends Displayable<Resource> {

    // all the methods that implements my enum
    // Displayable is just an interface that I need in my game
    // Just doesn't consider it, it can't interfer
}

以及实现此接口的枚举示例:

public enum LibraryEnum implements Resource {
    // static final fields

    // fields and resources

    // all implemented methods
}

问题是我想将它存储为一个接口,以启用一种枚举继承,因为我即将创建一个插件系统。任何开发者都只需要实现这个独特的接口来在游戏中添加资源。但我不知道他(或她)会如何命名它(可能会有一些双打)。

我有一个带有相关字段的类,如下所示:

@DatabaseTable(tableName = "packs")
public class Pack implements Displayable<Pack> {

    @DatabaseField(columnName = "id", generatedId = true)
    private Long packId;

    // Here it is
    @DatabaseField
    private Resource resource;
    // Is there any annotation arguments to add ?

    @DatabaseField
    private int quantity;

    // Some other fiels
    // Then constructors and methods
}

我已经阅读了一些文档,它说要创建 DataPersister 接口的自定义实现。于是我开始做,但是实现的方法太多了(20个?),不知道从哪里开始,从哪里结束。也许这是错误的做法? 文档显示了一个示例,其中方法甚至不存在,以及 java 中已经存在的类型(日期和日期时间)。

我怎样才能做到这一点?或者这甚至可能吗?如果没有,无论如何都可以做我想做的事(在数据库中存储未知的常量枚举字段)?

【问题讨论】:

    标签: java database enums ormlite


    【解决方案1】:

    我已经阅读了一些文档,它说要创建 DataPersister 接口的自定义实现。于是就开始做,但是要实现的方法太多了(20个?),不知从何开始,又从何结束。

    首先你应该考虑RTFM on custom persisters。我在ORMLite 文档上花了很多时间。

    正确的做法是从 ORMLite 扩展当前实现的持久化器。例如,如果要持久化枚举,则可以扩展 BaseEnumType。如果没有一个持久化器工作,那么你应该扩展通用的BaseDataType

    使用BaseDataType,您只需要实现:

    public Object parseDefaultString(FieldType fieldType, String defaultStr);
    
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos);
    

    虽然不是必需的,但您可能还想覆盖:

    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos)
    

    通常,您希望覆盖其他几个方法来调整自定义持久化器的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2021-11-22
      • 2020-06-04
      相关资源
      最近更新 更多