2015-03-18 50 views
1

我有一系列的POJO,我一直在使用龙目岛来填写和事情已经很顺利。我已经开始使用Java 8的可选<>类来做可选的事情,但是在将字节数组设置为可选时,我遇到了一个问题。在我的单元测试,比较对象的罚款比较这个类的两个实例建立以同样的方式:龙目岛EqualsAndHashCode处理可选阵列

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

我可以做的contentType,语言,链接和标题所有可选<>和测试仍然通过,但当我使数据可选时,测试突然失败。

private Optional<byte[]> data; 

结果:

expected 
[Attachment(contentType=Optional[UTF-8], language=Optional[en], data=Optional[[[email protected]], url=Optional[test://testuri], title=Optional[test text])] 
but found 
[Attachment(contentType=Optional[UTF-8], language=Optional[en], data=Optional[[[email protected]], url=Optional[test://testuri], title=Optional[test text])] 

是否有处理可选的阵列,使龙目岛可以处理比较任何具体的方法是什么?

+0

您是否将这个注册为bug? https://code.google.com/p/projectlombok/issues/detail?id=798&q=array&colspec=ID%20Type%20Status%20Priority%20Target%20Component%20Owner%20Summary 如果没有,至少有一个其他遇到同样问题的人。我的猜测是这是一个错误。龙目以前有一些Java 8相关的问题。 – Magnilex 2015-04-08 12:18:40

回答

2

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

可选<>不像龙目岛那么聪明,并没有考虑到这一点。我们无法真正解决这个问题。这是可选的问题。

可选的一般是非常有限的想法,在非常有限的从流API方法返回它的域之外的任何地方。你不应该在这里使用它,特别是不能用作任何字段或任何参数的类型。只是不要使用它。这对于阵列来说是双倍的;只需使用一个空数组。请注意:泛型和数组不能混用。理由#9103,可选是一个坏主意的Java。

+0

不幸的是,这是我们得出的结论。我们试图在我们的API中加入Optional,但遇到了很多根本无法解决的问题。随着可选,唯一的获胜动作是不玩。 – directedition 2015-08-19 22:21:46