Сгенерированные значения в заглушке веб-сервиса

StackOverflow https://stackoverflow.com/questions/367905

  •  21-08-2019
  •  | 
  •  

Вопрос

Все сгенерированные заглушки веб-сервисов из нашего бэкэнда имеют метод 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?Я просто этого не понимаю.Он не используется где-либо еще в классе.Насколько я понимаю, это не равно нулю точно при вычислении "равенства".Однако объявлено значение equals synchronized.Поэтому в любой момент времени в нем может находиться только один поток.Я не могу понять, почему if (__equalsCalc != null) это всегда должно быть правдой.

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

Редактировать:Я новичок в проекте, и поэтому мой ответ может быть неправильным.Но если я прослежу это правильно, метод будет сгенерирован axis-wsdl2java

Это было полезно?

Решение

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

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

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

Редактировать:Хорошо, теперь, когда мы знаем, что это 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("        }");

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

Другие советы

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

Редактировать:Извините, это было бы правдой, если бы

__equalsCalc = null;

не было бы там, но перепроверяю ваш код, вероятно, мой ответ неверен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top