Lombok EqualsAndHashCode处理可选数组

时间:2015-03-18 23:51:40

标签: java lombok

我有一系列POJO,我一直在使用龙目岛填写,事情非常顺利。我已经开始使用Java 8的Optional<>制作可选项了。 class,但是在使字节数组可选时,我遇到了麻烦。在我的单元测试中,比较对象工作得很好,比较这个类的两个实例以相同的方式构建:

@NoArgsConstructor @Getter @Setter @EqualsAndHashCode @ToString
public class Attachment {
  private String contentType;
  private LanguageCode language;
  private byte[] data;
  private URI url;
  private String title;
}

我可以将contentType,language,url和title设为all<>并且测试仍然通过,但是当我使数据可选时,测试突然失败。

private Optional<byte[]> data;

结果:

expected
[Attachment(contentType=Optional[UTF-8], language=Optional[en], data=Optional[[B@27eb3298], url=Optional[test://testuri], title=Optional[test text])]
but found
[Attachment(contentType=Optional[UTF-8], language=Optional[en], data=Optional[[B@200a26bc], url=Optional[test://testuri], title=Optional[test text])]

是否有任何特定的方法来处理可选数组,以便lombok可以处理比较?

1 个答案:

答案 0 :(得分:2)

龙目岛有着特殊的魔力;它知道数组不能正确地遵守equals合约,而是使用Arrays.equals。

可选&LT;&GT;并不像lombok那样聪明,也没有考虑到这一点。我们无法真正解决这个问题;这是可选的问题。

在从流API方法返回它的非常有限的域之外的任何地方,可选的是一个非常糟糕的想法。你不应该在这里使用它,特别是不能作为任何字段或任何参数的类型。只是不要使用它。对于数组来说,情况更是如此;只使用一个空数组。

注意:泛型和数组不混合。原因#9103对于java来说,可选是一个坏主意。

相关问题