Impresión de objeto único de identidad para fines de depuración en Java

Vamos a empezar con el código.

Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);

y, a continuación, en algún otro lugar mismo de nuevo, o posiblemente el mismo trozo de código que se ejecuta de nuevo, posiblemente en diferentes hilo.

Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);

Ahora arriba, si obj son el mismo objeto, la depuración de impresiones será el mismo, obviamente. Pero si son diferentes, todavía hay una oportunidad de hash de la colisión, por lo que la impresión puede ser el mismo, incluso para diferentes objetos. Así que tener la misma salida (o más generalmente, en la misma cadena) no garantiza el mismo objeto.

Pregunta: ¿hay una manera en Java para obtener el identificador exclusivo cadena por objeto cualquiera? O más formalmente, dar static String Id.str(Object o) método por lo que para que esto se siempre verdadero:

final Object obj1 = ...;
final String firstId = Id.str(obj1);
//arbitrary time passes, garbage collections happen etc.
//firstId and obj1 are same variables as above
(firstId.equals(Id.str.obj2)) == (obj1 == obj2)
InformationsquelleAutor hyde | 2013-01-24

2 Kommentare

  1. 8

    Creo, que en realidad no hay ningún método (es decir, la técnica) que va a garantizar que dicha singularidad de ID del objeto. El único propósito de la identificación – es un método para abordar este objeto de datos en la memoria. En caso de que cuando este objeto se muere y luego de ser eliminado de la memoria por la GC, nadie va a restringir el sistema para que utilice su dirección anterior de espacio para la colocación de los nuevos datos del objeto.

    Pero, de hecho, durante un corto período, entre todos los objetos disponibles, que tienen alguna referencia dentro de su programa, System.identityHashCode(obj) realmente darle único identidad de objeto. Esto es debido a que este hashCode se calcula usando el objeto en la ubicación de memoria. Sin embargo, es una característica de implementación, que no está documentado y garantizado para extranjeros de la Jvm.

    También, usted puede leer este famoso QA: Java: Cómo obtener el IDENTIFICADOR único de un objeto que reemplaza el hashCode()?

  2. 0

    Suponiendo que no es importante para este ID para ser en realidad el hashcode, entonces usted podría garantizar un IDENTIFICADOR único por tener una clase Singleton generación de ID que se le asigna a cada objeto. Usted puede utilizar este identificador en lugar de la etiqueta.

    ¿Cuál es su objetivo, tal vez hay mejores solitions?

    • Y cómo se sugieren para asignar tales ID del singleton a los objetos, que será creado por 3d-partes de los objetos?
    • Lo siento, se me debe haber olvidado de donde él dijo que yo estaba asumiendo que él es la definición de las clases y por lo tanto puede poner lo que le gusta de ellos.
    • Así, uno de los objetivos es lo que está implícito en la pregunta: en cuanto a los registros y ver impreso IDs. Obviamente hay soluciones alternativas, tales como la impresión de algunos casos específicos de la identificación de los datos cuando estén disponibles. Pero cuando el tipo es algo así como Future<>, esto es difícil. Así que me estoy preguntando si una solución genérica que existe.
    • Lo sentimos, no en el sentido de extender esta línea, como claramente esto no es lo que quieres, pero dado que el Futuro es genérico, estaba dando a entender que era el tipo del resultado devuelto te importaba y incorrectamente asumido esos iban a ser los objetos. Si usted necesita para trabajar a través de cualquier y todas las clases, incluyendo especialmente aquellos que no han producido, a continuación, esto no es posible y la probabilidad de colisión aumenta a medida que usted no tiene la vista de la etiqueta de las implementaciones.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea