Библиотека Immutables Java: Проверьте, все ли дополнительные опции пусты?
Я хотел бы определить, все ли Optional
члены неизменяемые пусты. Есть ли способ сделать это автоматически, не проверяя вручную все известные дополнительные функции?
Я обеспокоен тем, что даже если вы напишете проверку для каждого дополнительного члена, кто-то придет позже и добавит дополнительное поле без обновления этого метода.
1 ответ
Это может измениться в будущем, но я думаю, что вы можете попытаться взглянуть на перегруженные методы компоновщика, сгенерированные для необязательных элементов:
Для необязательного атрибута с именем
opt
где элементы имеют типT
opt(T)
устанавливает текущую стоимость дляT
opt(Optional<T>)
указывает на наличие или отсутствие
Пример
SomeValue.java
@Value.Immutable
public abstract class SomeValue {
public abstract int foo();
public abstract Optional<Object> obj();
public abstract com.google.common.base.Optional<Double> d();
}
TestImmutables.java
public class TestImmutables {
public static void main(String [] args) {
SomeValue someValue = ImmutableSomeValue.builder().foo(2).build();
for (Method method : someValue.getClass().getDeclaredMethods()) {
System.out.print(method.getName() + "(");
for (Type t : method.getGenericParameterTypes()) {
System.out.print(t);
System.out.print(",");
}
System.out.println(")");
}
}
}
Выход
Каждая строка - это метод, обратите внимание на методы, сгенерированные для необязательных элементов.
builder()
equalTo(class immutables.ImmutableSomeValue,)
withObj(class java.lang.Object,) < obj
withObj(java.util.Optional<java.lang.Object>,) < obj
withD(com.google.common.base.Optional<java.lang.Double>,) < d
withD(double,) < d
d()
withFoo(int,)
foo()
obj()
equals(class java.lang.Object,)
toString()
hashCode()
copyOf(class immutables.SomeValue,)
В основном вы ищете две перегрузки, каждая из которых имеет ровно один параметр, и если тип параметра равен один T
тип параметра другого SomeOptional<T>
,