首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我可以在JaVers中将枚举存储为序数而不是字符串吗?

JaVers是一款Java领域的版本控制和审计库,主要用于跟踪和比较Java对象的变化。对于将枚举存储为序数而不是字符串的需求,JaVers提供了相应的解决方案。

在JaVers中,可以通过使用@DiffIgnore注解来忽略特定字段的比较,包括枚举类型的字段。默认情况下,JaVers会将枚举类型字段存储为字符串。如果希望将枚举存储为序数,可以通过自定义ValueChangeAppender来实现。

具体步骤如下:

  1. 创建一个实现了ValueChangeAppender接口的类,用于处理枚举类型字段的存储方式。例如:
代码语言:txt
复制
public class EnumAsOrdinalAppender implements ValueChangeAppender<Enum<?>> {
    @Override
    public ValueChange appendChanges(ChangeMetadata metadata, PropertyChange propertyChange) {
        Object leftValue = propertyChange.getLeftValue();
        Object rightValue = propertyChange.getRightValue();

        if (leftValue instanceof Enum && rightValue instanceof Enum) {
            Enum<?> leftEnum = (Enum<?>) leftValue;
            Enum<?> rightEnum = (Enum<?>) rightValue;

            int leftOrdinal = leftEnum.ordinal();
            int rightOrdinal = rightEnum.ordinal();

            return ValueChange.newValueChange(metadata, leftOrdinal, rightOrdinal);
        }

        return null;
    }
}
  1. 在使用JaVers的代码中,注册自定义的ValueChangeAppender,将枚举类型字段存储为序数。例如:
代码语言:txt
复制
Javers javers = JaversBuilder.javers()
        .registerValueChangeAppender(new EnumAsOrdinalAppender())
        .build();

通过以上步骤,你可以在JaVers中将枚举存储为序数而不是字符串。

关于JaVers的更多信息和使用方法,可以参考腾讯云的文档:JaVers - 版本控制和审计库。请注意,本回答中提供的链接和产品信息仅供参考,并不代表对腾讯云的推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

后知后觉,Java枚举值也可以作为HTTP接口传参!

updateUserStatus方法中,我们通过@RequestParam注解接收用户状态。这样,我们就可以接口调用时传递枚举值,不是字符串。 为什么枚举可以作为HTTP接口传参呢?...其原因就在于,枚举Java中本质上也是类,它们可以被序列化为字符串Spring框架中,@RequestParam会自动将字符串参数转换为对应的枚举值,前提是这些枚举值是公开的且类中有定义。...当然,如果传参是json字符串对象,也可以枚举类中的序数来传递。像ACTIVEUserStatus中写在了第一位,那就可以用"0"来代替。...status=0" 不过这种方法依赖于枚举值的顺序与序数的一致性,如果改变了枚举的顺序,可能会得到不正确的枚举值,不建议使用。 总结 使用枚举值作为HTTP接口的传参可以显著提高代码的可读性。...当看到一个参数Weekday.MONDAY时,显然比看到一个字符串"monday"更加直观和易于理解。另外由于枚举值是预定义的,这意味着它们具有有限且确定的取值范围。

4710

尽可能使字符串相等(中等)

用于变更字符串的最大预算是 maxCost。转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。...那么接下来我们只需要找出成本不超过 maxCost 的最大长度区间,这个长度区间其实就是滑动窗口长度,滑动窗口长度的范围 [1, n] (n 字符串的长度)。 通过枚举来找答案可以?...我们可以通过数据范围大概分析一下哈,共有 n 个滑动窗口长度要枚举,复杂度 ,对于每个滑动窗口长度,需要对整个前缀和数组进行滑动检查,复杂度 。也就是整体复杂度是 的。...如果你对此分析方法比较陌生,可以去瞧一眼 4. 寻找两个正序数组的中位数(困难) 的总结部分 ~ 因此我们直接放弃通过枚举的朴素做法。 那么如何优化呢?...为了方便各位同学能够电脑上进行调试和提交代码, Github 建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode。

60530
  • Java中怎样由枚举常量的ordinal值获得枚举常量对象

    大家好,又见面了,是全栈君 Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方 enum Season { SPRING, SUMMER, AUTUMN,...本例中,对于Season.SPRING这个对象,Season.SPRING.name()能够得到该对象的字符串,即“SPRING”;反之,由Season.valueOf(“SPRING”)则能够得到该对象...也就是说,使用name()方法和valueOf(String)方法能够枚举类型对象和字符串之间方便得转换。...当然,假设valueOf(String)方法的參数不是枚举类型合法的字符串,则会抛出IllegalArgumentException异常。...在有些情况下,我们须要使用这个序数,并且还有可能再依据这个序数生成所须要的枚举对象,但是Enum并没有提供valueOf(int)这个方案,那是不是就做不到呢?

    1.8K10

    当Java枚举遇到位掩码,还能这么玩?

    不过细想一下,这种动态传的参数数组,Fastjson 接受后怎么知道我们具体传了哪些参数?接受时遍历数组,每次 equals 对比?... Fastjson 中使用了一种很巧妙的方式来处理这个动态的枚举参数 枚举中的序数(ordinal) 正式介绍之前,需要先了解枚举中的一个概念- 序数(ordinal),每个枚举类都会有一个 ordinal...属性,这个ordinal 代表的是当前枚举枚举类中的序号。...ordinal 1 F_C, // ordinal 2 F_D, // ordinal 3 ; } 通过 ordinal() 方法,就可以获取枚举实例的序数值,比如Feature....,就可以得到一个序数 1 的数字,比如序数 1 ,那么第0位就是1,序数3,那么第4就是1,以此类推,这样枚举中每个值的 mask 里 1 的位都会不同 多个配置的处理 单看这个位掩码还是觉得没啥用

    52640

    Enum源码解析

    我们使用枚举,很多场合会用到该枚举的字串符表达,上述的实现中只能得到一个数字,不能直观地表达该枚举常量的含义。当然也可用 String 常量,但是又会带来性能问题,因为比较要依赖字符串的比较操作。...大多数程序员应该使用toString方法不是访问此字段。...*/ private final int ordinal; /* 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数零)。 大多数程序员都没有使用这种方法。...* @param ordinal - 此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数零)。...* * 请注意,对于特定枚举类型T , * 可以使用该枚举上隐式声明的public static T valueOf(String)方法, * 不是使用此方法将名称映射到相应的枚举常量

    1.1K10

    SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易

    尝试使用内置的字符串函数执行任何复杂的文本分析会导致难于调试和维护的庞大的函数和存储过程。有更好的办法? 实际上,正则表达式提供了更高效且更佳的解决方案。...RegexMatch 函数 SQL Server 提供了许多功能, .NET 中的正则表达式实现提供的功能则更多,正如您在下面内容中将看到的一样。 ?...SQL Server 包括依赖于按需发生的处理过程的优化措施,因此更愿意编写自己的枚举器(按需返回各匹配项)不是预先返回整个集合。...通常,这类任务将在应用程序不是数据库中实现,这样会产生问题,因为使用该数据库的每个应用程序都必须实现所需过程。在此情况下,合理的方法是存储过程中实现此功能。...您可以使用 SQL Server 2005 中的枢轴功能不是游标来循环访问结果。将所有的访问结果一起放入存储过程,这样您就获得了全部所需内容。

    6.4K60

    深入分析Java的enum

    int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数零 String toString() 返回枚举常量的名称,它包含在声明中。...还有一些其他的方法就暂时不介绍了,感兴趣的话可以自己去看看文档或者源码,都挺简单的。 要点: 使用的是enum关键字不是class。 多个枚举变量直接用逗号隔开。...上面讲到了,枚举定义的时候会自动每个变量添加一个顺序,从0开始。 假如你希望0代表星期天,1代表周一。。。...当然可以: ? 你可以定义任何你想要的变量。学完了这些,大概枚举类你也应该掌握了,但是,还有没有其他用法呢? 枚举类中的抽象类 如果枚举类中定义一个抽象方法会怎么样?...实际上,初始化这个枚举类的时候,你可以理解执行的是TrafficLamp RED = new TrafficLamp(30) ,但是因为TrafficLamp里面有抽象方法,还记得匿名内部类么?

    1.3K110

    高性能MySQL(三):Schema与数据类型优化

    这种情况下适合使用VARCHAR: 字符串列的最大长度比平均长度大很多; 列的更新很少,所以碎片不是问题; 使用了像UTF-8 这样复杂的字符集,每个字符都使用不同的字节数进行存储。...---- 再次重申:数据如何存储取决于存储引擎,本篇我们只讲InnoDB ---- BLOG 和 TEXT 类型 BLOG和TEXT都是存储很大的数据而设计的字符串数据类型,分别采用二进制和字符串方式存储...(ENUM)代替字符串 有时候可以使用枚举列代替常用的字符串类型。...枚举可以把一些不重复的字符串存储成一个预定义的集合。...MySQL存储枚举时非常紧凑,会根据列表值的数量压缩到一个或者两个字节中,MySQL会在内部将每个值列表中的位置保存成整数,并且表的.frm文件中保存 “数字 - 字符串”映射关系的查找表。

    63310

    深入分析 Java 的枚举 enum

    所以 emum Gender 那个枚举中的成员 Male 相当于是 public static final Male = new Gender$1("Male", 0); //不是 new Gender...int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数零 String toString() 返回枚举常量的名称,它包含在声明中。...还有一些其他的方法就暂时不介绍了,感兴趣的话可以自己去看看文档或者源码,都挺简单的。 要点: 使用的是enum关键字不是class。 多个枚举变量直接用逗号隔开。...当然可以: ? 你可以定义任何你想要的变量。学完了这些,大概枚举类你也应该掌握了,但是,还有没有其他用法呢? 枚举类中的抽象类 如果枚举类中定义一个抽象方法会怎么样?...实际上,初始化这个枚举类的时候,你可以理解执行的是TrafficLamp RED = new TrafficLamp(30) ,但是因为TrafficLamp里面有抽象方法,还记得匿名内部类么?

    2K30

    Effective-java-读书笔记之枚举和注解

    更糟糕的是, 它会导致初级用户把字符串常量硬编码到客户端代码中, 不是使用适当的field....枚举天生不可变, 因此所有的域都是final的.有时候需要将不同的行为与每个常量关联起来, 可以枚举中定义抽象方法, 这样添加新的常量的时候就必须提供这个方法.如果多个枚举常量同时共享相同的行为, 则考虑策略枚举...返回每个枚举常量类型中的数字位置.永远不要根据枚举序数导出与它关联的值, 而是要将它保存在一个实例域中.第36条 用EnumSet代替位域如果一个枚举类型的元素主要用在集合中, 一般就用int枚举模式...(一维和多维的例子.)第38条 用接口模拟可扩展的枚举Java语言上是不支持枚举继承的, 这并不意外, 因为枚举的扩展最后证明都不是什么好点子....如果API是根据接口编写的, 那么可以使用基础枚举类型的任何地方, 也都可以使用这些枚举.第39条 注解优先于命名模式Java 1.5之前, 一般使用命名模式(naming pattern)表明有些程序元素需要通过某种工具或者框架进行特殊处理

    56150

    MySQL数据类型与优化

    比如应该使用MySQL内建的类型(date/time/datetime)不是字符串存储日期和时间 4、应该使用整形存储IP地址,不是字符串 5、尽量避免使用NULL,通常情况下最好指定列为NOT...枚举(ENUM) 1、有时候可以使用枚举类型代替常用的字符串类型。枚举可以把一些不重复的字符串存储成一个预定义的集合。MySQL存储枚举时非常紧凑,会根据列表值的数量压缩到一个或两个字节中。...MySQL在内部会将每个值列表中的位置保存为整数,并且表的.frm文件中保存"数字-字符串"映射关系的"查找表"。 2、枚举字段是按照内部存储的整数不是定义的字符串进行排序的。...4、由于MySQL把每个枚举值都保存为整数,并且必须进行查找才能转换为字符串,所以枚举列有一些开销,通常枚举列都比较小,所以开销还可以控制,特定情况下,把CHAR/VARCHAR列与枚举列进行关联可能会直接比关联...MySQL的存储引擎API工作时需要在服务层和存储引擎层之间通过行缓冲格式拷贝数据,然后服务器层将缓冲内容解码成各个列。从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的。

    1.6K10

    Java程序设计(基础)- 数据类型

    数据类型计算机语言里面,是对内存位置的一个抽象表达方式,可以理解针对内存的一种抽象的表达方式。...同时我们应该知道的是枚举类型可以像类(class)类型一样,定义一个单独的文件,当然也可以定义在其他类内部,更重要的是枚举常量类型安全性和便捷性都很有保证,如果出现类型问题编译器也会提示我们改进,但务必记住枚举表示的类型其取值是必须有限的...返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数零) String toString() 返回枚举常量的名称,它包含在声明中 static> T static...检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本、该副本中、所有的字符都被转换为大写或小写形式。 Date :Date表示特定的瞬间,精确到毫秒。...,只知道需要存储数据的个数,此时可以使用动态初始化方式。

    88120

    你需要知道的Java枚举知识

    枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中。在这里每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。...可以使用==来比较枚举实例 常用方法 枚举中的一些常用方法如下: int ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数零)。...之前,String字符串是不支持通过switch语法来筛选数据,但是 Java 枚举提供了switch语法的支持。...枚举策略 使用 Java 的枚举时往往会结合Switch来进行判断以实现不同值的处理,但是我们知道多用switch不是一种很好的代码风格,不利用维护和适应变化,因为这不符合开闭原则。...使用枚举类型的性能几乎是使用静态类的16倍。 枚举类型对象之间的值比较,可以使用==直接来比较值是否相等的,不是必须使用equals方法。

    57420

    高性能MySQL (一):Schema与数据类型优化

    这里有两个例子:一个是应该使用MySQL内建的类型(2)不是字符串存储日期和时间,另外一个是应该用整型存储IP地址。稍后我们将专门讨论这个话题。...MySQL对BLOB 和 TEXT列进行排序与其他类型是不同的:它只对每个列的最前max_sort_length 字节不是整个字符串做排序。...使用枚举(ENUM)代替字符串类型 有时候可以使用枚举列代替常用的字符串类型。枚举可以把一些不重复的字符串存储成一个预定义的集合。...枚举最不好的地方是,字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE。除非能接受只列表末尾添加元素,否则使用枚举不是个好主意。...太多的列 MySQL的存储引擎API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后服务器层将缓冲内容解码成各个列。从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的。

    1.1K40

    ava enum(枚举)使用详解 + 总结

    下面是使用 enum 过程中的一些经验和总结,主要包括如下内容: 1. 原始的接口定义常量 2. 语法(定义) 3. 遍历、switch 等常用操作 4. enum 对象的常用方法介绍 5....枚举类型符合通用模式 Class Enum>, E 表示枚举类型的名称。...枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序...int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数零)。...总结 可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum

    83430

    Kotlin Vocabulary | 枚举和 R8 编译器

    如果有,我们能做些什么来优化它? 接下来的内容与 Kotlin 中枚举 (enums) 和 when 语句 (java 中的 switch 语句) 有关。...R8 不是默认开启的,如果您希望使用它 (例如您想要这里讨论到的那些优化时),就需要启用它。...而且这个数组存储一个被生成的类文件中。这个类文件是从哪来的? 这里究竟发生了什么呢? 自动生成的枚举映射 事实上,为了实现二进制兼容,我们不能简单地依靠枚举序数值进行转换,因为这样的代码十分脆弱。...假设您的一个库中包含了一个枚举您改变了这个枚举中值的顺序,您就可能破坏了某个人的应用。虽然这些代码除了顺序,看起来完全相同,但就是这种顺序的不同导致了对其它代码的影响。...比如,它能避免枚举映射造成的开销: 它不需要那些映射信息,因为它知道这些代码只会以既定的方式使用这些枚举,所以它可以直接调用序数值。

    1K50

    前端面试算法题目浅析

    前端常遇见的数据结构问题现在来梳理下前端常遇见的数据结构:简单数据结构(必须理解掌握)有序数据结构:栈、队列、链表,有序数据结构省空间(存储空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间...可以想一下,数组的存储是有序的,对象的存储是无序的,但是要在对象中根据key找到一个值是立即返回的,数组则需要查找的过程。这里通过一个真实面试题目来说明介绍下数据结构设计。...稍微复杂点的页面中,比如组件化开发的页面,同一个页面由两三个人来开发,为了保证组件的独立性和降低组件间耦合度,我们往往使用「订阅发布模式」,即组件间通信使用事件监听和派发的方式,不是直接相互调用组件方法...「深拷贝」就是拷贝数据的时候,将数据的所有引用结构都拷贝一份。简单的说就是,在内存中存在两个数据结构完全相同又相互独立的数据,将引用型类型进行复制,不是只复制其引用关系。...递归的爆栈问题可以通过将递归改写成枚举的方式来解决,就是通过for或者while来代替递归。我们使用递归的时候,要注意做优化,比如下面的题目。

    21430

    win8 数据加密和解密

    win8中有时候需要对数据进行加密和解密的话,就可以用Windows.Security.Cryptography.DataProtection命名空间下的DataProtectionProvider类...public DataProtectionProvider(string protectionDescriptor); 加密数据的时候,使用第二个构造函数,即带一个参数的,参数字符串类型,但是,这个字符串不是乱写的...估计是这样的,有兴趣的朋友可以自己做做实验。...对于user级别,例如,以用户名“dog”登陆了当前系统,然后运了程序App,App中将文件kill加了密,如果要将加密后的文件解密还原到kill的内容,当前电脑必须用“dog”的用户登陆才能完成操作...ApplicationData.Current.LocalFolder此处是获取本地应用程序数存储区中的根文件夹(这个有读写权限) Package.Current.InstalledLocation

    1.2K20

    Ask Apple 2022 中与 Core Data 有关的问答

    如何保存枚举类型Q: Core Data 中存储 Swift 枚举( 有或没有关联值 )的推荐方法是什么?A:一种可能的解决方案是将枚举存储 Transformable 以处理关联值的情况。...),不触及实体及其属性,应该运行 initializeCloudKitSchema ?...为什么不是 14 天?非常希望一个可靠具体的示例,说明如何安全地清除历史数据以防止磁盘空间浪费。A:清除历史记录是由客户决定的。通常,应用每年或每半年清除一次历史记录。...可以用其了解设备是否执行了某种云迁移或其他活动?A:Core Data 将元数据存储存储文件本身中。此元数据归 Core Data 所有,不建议你更改它。...从 iOS 15 开始,可以 Model Editor 中将属性启用加密选项( 不支持老版本的 Model 升级)。

    2.9K20
    领券