日常总结 list 及lombok需注意

作者: Ian | 2019-06-04 | 阅读

lombok 注意的问题

@Data相当于@Getter , @Setter ,@RequiredArgsConstructor, @ToString ,@EqualsAndHashCode这5个注解的合集。

问题

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。 比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:

  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
  2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。

    注意

当你的类没有显式继承其他类的时候,使用该注解会有编译异常。

// 截取List集合中的一部分,组成新的List集合
        List<String> list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
//        list.add("7");
        for (int i = 0; i < list.size(); i = i + 2) {
            if (i + 2 > list.size()) {
//                System.out.println(list.subList(i, list.size()));
                String num = list.subList(i, list.size()).toString();
                System.out.println(num);
            } else {
                String num = formatList(list.subList(i, i + 2),"&");
//                System.out.println(list.subList(i, i + 2));
                System.out.println(num);
            }

        }

    }

public static String formatList(List<String> list, String delimiter) {
        return String.join(delimiter, list);
    }
    
    
//输出:
1&2
3&4
5&6

参考:lombok @EqualsAndHashCode 注解的影响–https://www.cnblogs.com/liaojie970/p/8939951.html

参考:Java8(2):Java8 对字符串连接的改进:https://segmentfault.com/a/1190000007835105

官方文档:@EqualsAndHashCode: https://projectlombok.org/features/EqualsAndHashCode

文章中若有不足之处,还望指出。坚持是一种精神,分享是一种快乐!


版权声明:本文由 Ian 在 2019年06月04日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《日常总结 list 及lombok需注意》




  相关文章:


留言区:

TOP