как в общем сравнить все бобы Java?

Любые данные, хранящиеся в вашем компьютере, и процессы в самом базовом представлении представляют собой строку бит. То, как эти биты интерпретируются, осуществляется через типы данных. Типы данных могут быть примитивными или сложными. Примитивные типы данных - например, int или double. Они имеют определенную длину и конкретный способ интерпретации. В случае целого числа обычно используется первый бит для знака, остальные используются для значения.

Сложные типы данных могут быть комбинациями примитивных и других сложных типов данных и называются «Class "в Java.

Вы можете определить сложный тип данных PeopleName, состоящий из двух строк, называемых именем и фамилией. Каждая строка в Java является еще одним сложным типом данных. Строки в обратном порядке (возможно) реализованы с использованием примитивного типа данных char, для которого Java знает, сколько бит они берут для хранения и как их интерпретировать.

Когда вы создаете экземпляр типа данных, вы получаете объект и ваши компьютеры резервируют для него некоторую память и запоминают его местоположение и имя этого экземпляра. Экземпляр PeopleName в памяти займет пространство двух переменных String плюс немного больше для бухгалтерии. Целое число занимает 32 бита в Java.

Сложные типы данных могут иметь назначенные им методы. Методы могут выполнять действия по своим аргументам или по экземпляру типа данных, вызываемого этим методом. Если у вас есть два экземпляра PeopleName, называемых p1 и p2, и вы вызываете метод p1.getFirstName (), он обычно возвращает первое имя первого человека, но не второго человека.

18
задан ysouter 23 January 2009 в 11:41
поделиться

3 ответа

Попробуйте EqualsBuilder.reflectionEquals () из Ленг свободного городского населения . EqualsBuilder имеет ряд методов для включения всех полей, всех непереходных полей и почти определенных полей.

, Если все остальное перестало работать, код мог бы служить хорошим примером, как реализовать это.

19
ответ дан 30 November 2019 в 08:10
поделиться

Для ответа на вопрос непосредственно Вы могли использовать отражение, чтобы сделать проверку равенства бобов. Существует несколько препятствий, о которых необходимо знать.

существуют правила относительно поведения, равняется () и хэш-код (). Эти правила говорят о симметрии, непротиворечивость и рефлексивность, которую может быть трудно сделать, когда Ваш равняется методу, ведут себя динамично на основе другого объекта, в котором Вы являетесь передающими.

Интересное чтение: http://www.geocities.com/technofundo/tech/java/equalhash.html

Вообще говоря, я думаю, что Вы - более обеспеченное создание Вашего собственного хэш-кода, и равняется методам. Существует fwe польза плагины, которые могут автоматически сгенерировать тот код для Вас на основе свойств класса.

сказавший все это, вот являются некоторые (старый стиль) методами для получения методов считывания, методов set и свойств, которые я записал давным-давно:

private Map getPrivateFields(Class clazz, Map getters, Map setters) {
    Field[] fields = clazz.getDeclaredFields();
    Map m = new HashMap();
    for (int i = 0; i < fields.length; i++) {
        int modifiers = fields[i].getModifiers();
        if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
            String propName = fields[i].getName();
            if (getters.get(propName) != null && setters.get(propName) != null) {
                m.put(fields[i].getName(), fields[i]);
            }
        }
    }
    return m;
}

Методы считывания:

private Map getGetters(Class clazz) {
    Method[] methods = clazz.getMethods();
    Map m = new HashMap();
    for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName().startsWith("get")) {
            int modifiers = methods[i].getModifiers();
            if (validAccessMethod(modifiers)) {
                m.put(getPropertyName(methods[i].getName()), methods[i]);
            }
        }
    }
    return m;
}

И Методы set:

private Map getSetters(Class clazz, Map getters) {
    Method[] methods = clazz.getMethods();
    Map m = new HashMap();
    for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName().startsWith("set")) {
            int modifiers = methods[i].getModifiers();
            String propName = getPropertyName(methods[i].getName());
            Method getter = (Method) getters.get(propName);

            if (validAccessMethod(modifiers) && getter != null) {
                Class returnType = getter.getReturnType();
                Class setType = methods[i].getParameterTypes()[0];
                int numTypes = methods[i].getParameterTypes().length;

                if (returnType.equals(setType) && numTypes == 1) {
                    m.put(propName, methods[i]);
                }
            }
        }
    }
    return m;
}

, Возможно, можно использовать это для самокрутки.

Редактирование: , Конечно, reflectionbuilder в ответ Aaron Digulla намного лучше, чем моя ручная работа.

8
ответ дан 30 November 2019 в 08:10
поделиться

Как упомянуто выше, основанная на отражении реализация сделает то, что Вы хотите. Я просто хотел предупредить Вас, что отражение является довольно дорогостоящим, и такая реализация могла быть сравнительно медленной. Если просто необходимо сделать случайные сравнения, Вы будете в порядке. Однако, если у Вас есть огромные наборы данных и частые проверки равенства (например, фильтрация больших таблиц), Вы могли бы попасть в беду.

2
ответ дан 30 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

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