Сама Oracle использует Y/N для булевых значений. Для полноты нужно отметить, что pl/sql имеет булев тип, это - только таблицы, которые не делают.
при использовании поля, чтобы указать, должна ли запись быть обработана или не, Вы могли бы рассмотреть использование Y и ПУСТОГО УКАЗАТЕЛЯ как значения. Это делает для очень маленького (читайте быстро), индекс, который занимает очень мало места.
Ну, учитывая, что я не смог найти "чистый" способ сделать это, и тот факт, что я постоянно сталкивался с угловыми случаями (например, помимо этого, сложность обработки свойств, которые являются коллекциями), я решил сделать свой метод генерации дельты способом тупее. Я понял, что тестирую только 9 различных типов объектов, поэтому я могу просто проверить, какой из 9 объектов, которые я сравниваю, затем привести к этому объекту и провести объектно-ориентированное тестирование.
Реализация этого способа заняла около в час, и хотя мне приходится перекомпилировать каждый раз, когда любой из объектов меняется, я полагаю, что я все еще в плюсе, даже если трачу дни на это обслуживание.
Итак, в конце концов, я думаю, Ответ в том, что ответа нет.
Мне кажется, что все идет по твердому пути. У вас может быть либо сопоставимая реализация bean-компонентов, и в этом случае вы просто сравниваете их напрямую, либо вы создаете компаратор -
public class Bean implements Comparable<Bean> {...}
public int compareTo(Bean other){ ... }
}
или
public int compare(Bean a, Bean b){
Comparator<Bean> c = new Comparator<Bean>(){
public int compareTo(Bean a, Bean b){ ... }
public boolean equals(Object o){.. }
};
return c.compare(a, b);
}
Я согласен с вами, что java-дженерики могут быть немного, э ... запутанными.
Я не совсем понимаю, что плохого в том, чтобы просто сделать следующее:
MyObject original = getOriginal();
MyObject updated = getUpdated();
for (PropertyDescriptor pd : BeanUtils.getPropertyDescriptors(MyObject.class)) {
// Assume I'm putting in the try/catch block
Object pOriginal = pd.getReadMethod().invoke(original, (Object[]) null);
Object pUpdated = pd.getReadMethod().invoke(updated, (Object[]) null);
boolean isPropertySame;
if (pOriginal instanceof Comparable) {
@SuppressWarnings("unchecked")
Comparable<Object> originalValue = (Comparable<Object>) pOriginal;
@SuppressWarnings("unchecked")
Comparable<Object> updatedValue = (Comparable<Object>) pUpdated;
isPropertySame = originalValue.compareTo(updatedValue) == 0;
} else {
isPropertySame = pOriginal.equals(pUpdated);
}
if (!isPropertySame) {
PropertyDelta delta = new PropertyDelta(pd, pOriginal, pUpdated);
dao.save(delta);
}
}
Использование Class.cast
в вашем случае действительно не помогает с типом безопасность.
Похоже, предполагается, что если класс реализует Comparable
, параметром типа является сам класс. То есть « класс X реализует Comparable
». Если это так, то имеет смысл сказать:
X a = new X(1), b = new X(2);
a.compareTo(b);
Однако определенно можно определить класс типа « класс X реализует Comparable
». Тогда можно было бы попробовать что-то вроде этого…
X a = new X(1), b = new X(2);
a.compareTo((Y) b);
… но очевидно, что возникнет исключение ClassCastException
, потому что b
не является экземпляром Y
.
Итак, предупреждение действительно. Код, использующий необработанные типы, небезопасен по типу и может вызывать исключения во время выполнения.