Сгенерированные равные в Webservice Stub - PullRequest
5 голосов
/ 15 декабря 2008

Все сгенерированные заглушки webservice из нашего бэкэнда имеют метод equals, подобный этому:

private java.lang.Object __equalsCalc = null;
public synchronized boolean equals(java.lang.Object obj) {
    if (!(obj instanceof PropertyData)) return false;
    PropertyData other = (PropertyData) obj;
    if (obj == null) return false;
    if (this == obj) return true;
    if (__equalsCalc != null) {
        return (__equalsCalc == obj);
    }
    __equalsCalc = obj;
    boolean _equals;
    _equals = true && 
        ((this.key==null && other.getKey()==null) || 
         (this.key!=null &&
          this.key.equals(other.getKey()))) &&
        ((this.value==null && other.getValue()==null) || 
         (this.value!=null &&
          this.value.equals(other.getValue())));
    __equalsCalc = null;
    return _equals;
}

Может кто-нибудь объяснить мне цель __equalsCalc? Я просто не понимаю Это не используется где-то еще в классе. На мой взгляд, он не равен нулю точно при вычислении «равенства». Однако равные объявляются synchronized. Поэтому только один поток может быть в нем в любой момент времени. Я не понимаю, почему if (__equalsCalc != null) должно быть правдой.

Пожалуйста, покажите мне мое глупое недоразумение; -)

РЕДАКТИРОВАТЬ: Я новичок в проекте, и поэтому мой ответ может быть неправильным. Но если я прослеживаю это правильно, метод генерируется axis-wsdl2java

Ответы [ 2 ]

7 голосов
/ 15 декабря 2008

Я подозреваю, что он пытается остановить рекурсию - если что-то имеет себя в качестве ключа, вы не хотите, чтобы оно повторялось вечно.

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

Что генерирует этот код? Это доморощенная система или публичная? Если он доморощенный, отвечает ли разработчик за компанию?

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда мы знаем, что это WSDL2Java, ответ (вроде) в исходный код :

    // The __equalsCalc field and synchronized method are necessary
    // in case the object has direct or indirect references to itself.

и затем:

    // Have we been here before ? return true if yes otherwise false
    pw.println("        if (__equalsCalc != null) {");
    pw.println("            return (__equalsCalc == obj);");
    pw.println("        }");

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

0 голосов
/ 15 декабря 2008

__equalsCal ведет себя как кэш для последнего вызова Equals. Таким образом, если два вызова в одном и том же экземпляре метода equals выполняются с одним и тем же параметром, метод будет быстрее

РЕДАКТИРОВАТЬ: Извините, это было бы верно, если

__equalsCalc = null;

не было бы там, но перепроверив ваш код, возможно, мой ответ неверен.

...