Любой недостаток этой реализации Java ValueObject
Я смотрю на возможные реализации универсального класса ValueObject для Java. Я видел несколько возможных решений - жесткое кодирование равно методам в каждом объекте, используя Lombok, используя @AutoValue от Google, используя отражение и т. Д. Просто вспомнил, что использование лямбда-выражений является одним из возможных решений - но не знаю, есть ли недостатки этого один?
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
public abstract class ValueObject<T extends ValueObject<T>> {
protected abstract List<Supplier> supplyGettersToIncludeInEqualityCheck();
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
T obj2 = (T)obj;
for(int i = 0; i< supplyGettersToIncludeInEqualityCheck().size(); i++){
if(!Objects.equals(supplyGettersToIncludeInEqualityCheck().get(i).get(), obj2.supplyGettersToIncludeInEqualityCheck().get(i).get())){
return false;
}
}
return true;
}
}
и тогда стандартное использование внутри объектов значения будет
import java.util.*;
import java.util.function.Supplier;
public class ValO extends ValueObject<ValO> {
private String value;
private int int2;
public ValO(String value, int int2) {
this.value = value;
this.int2 = int2;
}
public String getValue() {
return value;
}
public int getInt2() {
return int2;
}
@Override
protected List<Supplier> supplyGettersToIncludeInEqualityCheck() {
return Arrays.asList(this::getValue, this::getInt2);
}
}