Кастинг к Сопоставимому, затем Сравнению

Сама Oracle использует Y/N для булевых значений. Для полноты нужно отметить, что pl/sql имеет булев тип, это - только таблицы, которые не делают.

при использовании поля, чтобы указать, должна ли запись быть обработана или не, Вы могли бы рассмотреть использование Y и ПУСТОГО УКАЗАТЕЛЯ как значения. Это делает для очень маленького (читайте быстро), индекс, который занимает очень мало места.

7
задан Monkey Boson 6 August 2009 в 22:27
поделиться

4 ответа

Ну, учитывая, что я не смог найти "чистый" способ сделать это, и тот факт, что я постоянно сталкивался с угловыми случаями (например, помимо этого, сложность обработки свойств, которые являются коллекциями), я решил сделать свой метод генерации дельты способом тупее. Я понял, что тестирую только 9 различных типов объектов, поэтому я могу просто проверить, какой из 9 объектов, которые я сравниваю, затем привести к этому объекту и провести объектно-ориентированное тестирование.

Реализация этого способа заняла около в час, и хотя мне приходится перекомпилировать каждый раз, когда любой из объектов меняется, я полагаю, что я все еще в плюсе, даже если трачу дни на это обслуживание.

Итак, в конце концов, я думаю, Ответ в том, что ответа нет.

0
ответ дан 7 December 2019 в 07:49
поделиться

Мне кажется, что все идет по твердому пути. У вас может быть либо сопоставимая реализация 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-дженерики могут быть немного, э ... запутанными.

4
ответ дан 7 December 2019 в 07:49
поделиться

Я не совсем понимаю, что плохого в том, чтобы просто сделать следующее:

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 в вашем случае действительно не помогает с типом безопасность.

2
ответ дан 7 December 2019 в 07:49
поделиться

Похоже, предполагается, что если класс реализует 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 .

Итак, предупреждение действительно. Код, использующий необработанные типы, небезопасен по типу и может вызывать исключения во время выполнения.

1
ответ дан 7 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: