Как Вы получаете “ссылку на объект” объекта в Java, когда toString () и хэш-код () были переопределены?

Пример использования:

objs.sort(sortBy('last_nom'));

Сценарий:

/**
 * @description 
 * Returns a function which will sort an
 * array of objects by the given key.
 * 
 * @param  {String}  key
 * @param  {Boolean} reverse
 * @return {Function}     
 */
function sortBy(key, reverse) {

  // Move smaller items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  var moveSmaller = reverse ? 1 : -1;

  // Move larger items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  var moveLarger = reverse ? -1 : 1;

  /**
   * @param  {*} a
   * @param  {*} b
   * @return {Number}
   */
  return function(a, b) {
    if (a[key] < b[key]) {
      return moveSmaller;
    }
    if (a[key] > b[key]) {
      return moveLarger;
    }
    return 0;
  };

}
99
задан Nicolai 24 February 2009 в 09:54
поделиться

5 ответов

То, что точно является Вами планирование выполнения с ним (что Вы хотите сделать, имеет значение с тем, что необходимо будет назвать).

hashCode , как определено в JavaDocs, говорит:

так, как довольно практично, метод хэш-кода, определенный объектом класса, действительно возвращает отличные целые числа для отдельных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется Java™ язык программирования.)

Поэтому, если Вы используете hashCode(), чтобы узнать, является ли это уникальный объект в памяти, которая не является хорошим способом сделать это.

System.identityHashCode делает следующее:

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

то, Которое, поскольку то, что Вы делаете, походит на то, что Вы хотите..., но что Вы хотите сделать, не могло бы быть безопасным в зависимости от того, как библиотека реализована.

101
ответ дан MC Emperor 5 November 2019 в 12:08
поделиться

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

Для записи, я испытал несколько объектов с тем же хэш-кодом по умолчанию в VM IBM, работающем в, БЫЛ сервер. У нас был дефект, где объекты, помещаемые в удаленный кэш, перезаписать из-за этого. Это было сенсационным сообщением для меня в той точке, так как я предположил, что хэш-код по умолчанию был адресом памяти объектов также.

4
ответ дан Robin 5 November 2019 в 12:08
поделиться

Это - то, как я решил его:

Integer.toHexString(System.identityHashCode(object));
48
ответ дан Nicolai 5 November 2019 в 12:08
поделиться

Дважды равняется ==, будет всегда проверять на основе объектных идентификационных данных, независимо от реализации объектов хэш-кода или равняется. Конечно - удостоверяются ссылки на объект, которые Вы сравниваете, volatile (в 1.5 + JVM).

, Если у Вас действительно должен быть исходный объект toString результат (хотя это не лучшее решение для Вашего примера использования в качестве примера), библиотека Lang палаты общин имеет метод ObjectUtils.identityToString (Объект) , который сделает то, что Вы хотите. От JavaDoc:

public static java.lang.String identityToString(java.lang.Object object)

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

 ObjectUtils.identityToString(null)         = null
 ObjectUtils.identityToString("")           = "java.lang.String@1e23"
 ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
8
ответ дан noahlz 5 November 2019 в 12:08
поделиться

Добавьте, что уникальный идентификатор ко всем Вашим экземплярам, т.е.

public interface Idable {
  int id();
}

public class IdGenerator {
  private static int id = 0;
  public static synchronized int generate() { return id++; }
}

public abstract class AbstractSomething implements Idable {
  private int id;
  public AbstractSomething () {
    this.id = IdGenerator.generate();
  }
  public int id() { return id; }
}

Расширяются от AbstractSomething и запрашивают это свойство. Будет безопасно в единственном vm (принимающий ведение игры с classloaders обойти помехи).

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

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