¿Por qué getStamp () devuelve el mismo valor?

Leí este código en Thinking in Java y me intrigó:

    package generics;

    //: generics/Mixins.java
    import java.util.*;

    interface TimeStamped { long getStamp(); }

    class TimeStampedImp implements TimeStamped {
      private final long timeStamp;
      public TimeStampedImp() {
        timeStamp = new Date().getTime();
      }
      public long getStamp() { return timeStamp; }
    }

    interface SerialNumbered { long getSerialNumber(); }

    class SerialNumberedImp implements SerialNumbered {
      private static long counter = 1;
      private final long serialNumber = counter++;
      public long getSerialNumber() { return serialNumber; }
    }

    interface Basic {
      public void set(String val);
      public String get();
    }

    class BasicImp implements Basic {
      private String value;
      public void set(String val) { value = val; }
      public String get() { return value; }
    }

    class Mixin extends BasicImp
    implements TimeStamped, SerialNumbered {
      private TimeStamped timeStamp = new TimeStampedImp();
      private SerialNumbered serialNumber =
        new SerialNumberedImp();
      public long getStamp() { return timeStamp.getStamp(); }
      public long getSerialNumber() {
        return serialNumber.getSerialNumber();
      }
    }

    public class Mixins {
      public static void main(String[] args) {
        Mixin mixin1 = new Mixin(), mixin2 = new Mixin();
        mixin1.set("test string 1");
        mixin2.set("test string 2");
        System.out.println(mixin1.get() + " " +
          mixin1.getStamp() +  " " + mixin1.getSerialNumber());
        System.out.println(mixin2.get() + " " +
          mixin2.getStamp() +  " " + mixin2.getSerialNumber());
        while(true)System.out.println(new Date().getTime());
      }
    } /* Output: (Sample)
    test string 1 1132437151359 1
    test string 2 1132437151359 2
    *///:~

¿Por qué los valores devueltos de getStamp () son los mismos? (1132437151359 == 1132437151359)? Se crean dos objetos y tienen diferentes propiedades creadas en tiempos diferentes, entonces ¿Por qué?

Respuesta 1

La expresión new Date().getTime()es una forma lenta de hacerlo System.currentTimeMillis()que tiene una resolución mínima de un milisegundo (pero puede ser de hasta 16 ms en algunos sistemas operativos)

Esto significa que si el método se llama con menos de un milisegundo de separación, puede dar el mismo resultado.

Una mejor opción es usar AtomicLong.getAndIncrement () para los identificadores.

Respuesta: 2

Usar el tiempo para números de serie no es una buena idea. La razón por la que está obteniendo el mismo tiempo es probablemente porque el código se ejecuta bastante rápido y no transcurre suficiente tiempo entre la creación de instancias del primer objeto y el segundo. La marca de tiempo se devuelve en milisegundos y, por lo tanto, si la creación de instancias de ambos objetos está dentro de 1 ms entre sí, no verá una diferencia.

Si aumenta la carga en el sistema, es posible que vea una diferencia, o si lo usa Thread.sleep(5)para hacer que su programa se detenga. Ambos enfoques no son muy buenos.

En lugar de usar el tiempo para una identificación única, use UUID.

Respuesta: 3

Estoy usando la función "push ()" para almacenar objetos en mi base de datos de Firebase y dado que almacena datos con claves únicas, no puedo cambiar los valores de los objetos almacenados usando lo que se menciona en el ...

Hola, soy nuevo en Struts2 y tengo ese problema. Escribo una aplicación web con mosaicos. Esta es la estructura de mi aplicación. Este es mi web.xml <filter> <filter-name> struts2 </filter-name> <...

Tengo una cadena que debe dividirse según un delimitador (:). Este delimitador puede ser escapado por un personaje (diga '?'). Básicamente, el delimitador puede estar precedido por cualquier número de caracteres de escape. ...

Errmm, sí, esperaba usar el RangeSeekBar en mi aplicación MonoDroid, pero, sinceramente, ni siquiera estoy seguro de si esto es posible / cuál es la mejor opción / ¿por dónde empezar? ¿Necesito portar ...