2015-03-18 2 views
1

У меня есть серия POJO, которые я использовал Lombok для заполнения, и все было довольно гладко. Я начал делать вещи необязательными, используя класс Java 8 Необязательный <>, но я столкнулся с проблемой при создании байтового массива. В моих модульных тестах, сравнивающие объекты работали отлично сравнивая два экземпляра этого класса построен одинаково:Lombok 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, язык, URL и название всего Дополнительного <> и тесты все еще проходят, но тест неожиданно сбой, когда я делаю данные опционными.

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

Это вы зарегистрировали это как ошибку? https://code.google.com/p/projectlombok/issues/detail?id=798&q=array&colspec=ID%20Type%20Status%20Priority%20Target%20Component%20Owner%20Summary Если нет, есть, по крайней мере, еще один человек испытывает ту же проблему. Я предполагаю, что это ошибка. Ранее у Ломбока были некоторые проблемы, связанные с Java 8. – Magnilex

ответ

2

Ломбок имеет специальную магию; он знает, что массивы не прилипают к равному контракту должным образом и вместо этого используют Array.

Дополнительный <> не такой умный, как ломбок, и не считал это. Мы не можем это исправить; это проблема с дополнительным.

Необязательный вариант в целом - очень плохая идея в любом месте вне очень ограниченного домена, возвращающего его из методов потока API. Вы не должны использовать его здесь, особенно не как тип любого поля или какого-либо параметра. Просто не используйте его. Это вдвойне подходит для массивов; просто используйте пустой массив.

NB: Общие и массивы не смешиваются. Причина № 9103 в том, что факультативно это плохая идея для Java.

+0

Это, к сожалению, вывод, к которому мы пришли. Мы попытались включить Необязательный в наш API, но столкнулись со многими проблемами, которые просто не имели решения. С опцией, единственный выигрышный ход - не играть. – directedition

Смежные вопросы