Java crear un IDENTIFICADOR único para cada objeto instanciado el uso de métodos de instancia en lugar de la clase/métodos estáticos

Bastante nuevo en esto así que espero tener la terminología del derecho de título.

Estoy tratando de averiguar cómo crear un método de instancia que hacer lo siguiente:

–Un número de IDENTIFICACIÓN es devuelto.

–Como cada objeto es creado desde el constructor de la clase(instanciado?), un número entero único número de IDENTIFICACIÓN asignado. El primer número de ID es 1, y como a los objetos que se crean instancias de los sucesivos números serán asignados.

Soy capaz de encontrar ejemplos de la clase/métodos estáticos que hacer lo anterior sin embargo no soy capaz de averiguar cómo hacer esto con un método de instancia. Mi intento es el siguiente:

class Coordinates
{
    private int iD = 0;
    private float xCoordinate;
    private float yCoordinate;

    public Coordinates()
    {
        //Asks for input and assigns it to the two variables below
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please enter the X Coordinate followed by the return key");
        xCoordinate = keyboard.nextDouble();
        System.out.println("Please enter the Y Coordinate followed by the return key");
        yCoordinate = keyboard.nextDouble();

        iD++;
    }

    public getiD()
    {
        return iD;
    }

}

Mi principal método es el siguiente:

public class Machine
{
    public static void main(String[] args)
    {
        Coordinates c1 = new Coordiantes();
        Coordinates c2 = new Coordiantes();
        Coordinates c3 = new Coordiantes();

        System.out.println("ID: " + c1.getID());
        System.out.println("ID: " + c2.getID());
        System.out.println("ID: " + c3.getID());


    }
}

Por favor nota que no se ha incluido toda mi código para el bien de la simplicidad y la facilidad con la que seguir. Espero que os he agregado suficiente.

Yo también no desea utilizar java.util.UUID.

  • Usted necesita un static de identificación de generador y una instancia id campo para la instancia actual.
InformationsquelleAutor SeesSound | 2016-02-17

4 Kommentare

  1. 4

    El problema ahora es que su ‘id’ es una variable de instancia, lo que significa que pertenecen a los objetos que cree.
    Pensar que cada vez que se crea un objeto de una nueva copia de su variable de instancia se hace.
    Así que cada vez que se crea un objeto de la identificación es el primer set a 0, a continuación, puesto que se incrementa una vez (por lo tanto todos los objetos tienen un id=0).

    Si desea crear una variable que, por ejemplo, cuenta automáticamente todos los objetos que se han creado en una clase o id, usted necesita para hacer que una variable de clase.
    Estas variables pertenecen a todos los objetos creados a partir de una clase y la palabra clave utilizada para el que es «estático».

    Nota: he utilizado una variable estática, PERO no un método estático. Si usted no desea utilizar estática en absoluto, es una cuestión diferente

    class Coordinates
    {
    private static int count = 0;
    private int id=0;
    private float xCoordinate;
    private float yCoordinate;
    
    public Coordinates()
    {
        //Asks for input and assigns it to the two variables below
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please enter the X Coordinate followed by the return key");
        xCoordinate = keyboard.nextDouble();
        System.out.println("Please enter the Y Coordinate followed by the return key");
        yCoordinate = keyboard.nextDouble();
    
        id=count++;
    }
    
    public getiD()
    {
        return iD;
    }
    
    }

    Un simple cambio de palabras clave hará que su programa correcto. Usted no tiene que hacer demasiado complicadas.

    Es difícil comprender el concepto de clase y objetos estáticos y variables de instancia en un primer momento. Déjeme saber si usted quisiera más explicación 🙂

    • Excelente fácil de seguir el ejemplo. El único cambio que hice fue id=++contar, de modo que cuando una se opuso que se crea una instancia, el valor de conteo de cambio para 1 Y, a CONTINUACIÓN, se asigna a pointID. Esto podría hacer que el id de inicio de 1 en lugar de 0
    • Me alegro de saber!
    • Cómo podemos lograr esto sin estática en absoluto?
    • Vea a continuación la respuesta stackoverflow.com/a/35461985/5930693
  2. 3

    El mantenimiento de un IDENTIFICADOR de secuencia es independiente de la responsabilidad del resto de cuál sea su objeto, y no pertenece a ninguna instancia de las Coordenadas de la clase, de modo que pertenece en un objeto diferente. Hacer que un objeto independiente para mantener la secuencia y de la mano de los números, algo así como

    public class MySequence {
        private AtomicLong currentValue = new AtomicLong(0L);
        public long getNextValue() {
            return currentValue.getAndIncrement();
        }
    }

    a continuación, utilizar la secuencia para inicializar los objetos:

    new CoordinatePair(mySequence.getNextValue(), x, y);

    Por el camino de mantenimiento de usuario de entrada independiente desde el modelo hace las cosas más simples, puede que desee crear una instancia de su Coordenadas de clase en los casos donde la entrada no viene por el usuario. De entrada de la consola no ir en un constructor. Usted podría tener una Coordenada de la clase como

    public CoordinatePoint {
        private long id;
        private float x;
        private float y;
        public CoordinatePoint(long id, float x, float y) {
            this.id = id;
            this.x = x;
            this.y = y;
        }
        public String toString() {
            return "id=" + id + ", (" + x + ", " + y + ")";
        }
    }

    y un método main como

    public class Example {
    
        public static void main(String ... args) {
            MySequence seq = new MySequence();
            Scanner keyboard = new Scanner(System.in);
            System.out.println("Please enter the X Coordinate followed by the return key");
            float xCoordinate = keyboard.nextDouble();
            System.out.println("Please enter the Y Coordinate followed by the return key");
            float yCoordinate = keyboard.nextDouble();
            CoordinatePoint c1 = new CoordinatePoint(seq.getNextValue(), xCoordinate, yCoordinate);
            System.out.println(c1.toString());
        }
    }
    • Esto es un poco difícil para alguien como yo a seguir. Podría usted ampliar su código para explicar AtomicLong, y getNextValue. Además, ¿de dónde entrada de la consola ir entonces? En el método main de la derecha antes de que un objeto es instancia?
    • AtomicLong está aquí: docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/…, sólo se ajusta un valor y permite que las actualizaciones de forma atómica. Y sí, el método principal sería un buen lugar para hacer su entrada de la consola.
    • Se podría utilizar un LongAdder en lugar de AtomicLong si multi-threading y el alto rendimiento son importantes. blog.palominolabs.com/2014/02/10/…
    • no hay ninguna indicación de que el multithreading es relevante aquí. He utilizado AtomicLong aquí porque es fácil y no quería overthink un juguete ejemplo (aunque todavía cerrando nitpickers que se quejan sobre el uso de ++ o +=).
  3. 2

    En el contexto de su código actual, la cosa más simple de hacer es la siguiente:

    import java.util.concurrent.atomic.AtomicInteger;
    
    public class Coordinates {
    
        //static id generator shared among all instances of Coordinates 
        private static final AtomicInteger idGenerator = new AtomicInteger(1000);
    
        private final Integer id;
    
        public Coordinates() {
            //assign unique id to an instance variable
            id = idGenerator.getAndIncrement();
        }
    
        public int getId() {
            //return instance variable
            return id;
        }
    }

    Prueba

    public class Test {
    
        public static void main(String[] args) {
            for(int i = 0; i < 10; ++ i){
                System.out.println(new CoordinatePoint().getId());
            }
        }
    }

    Salida

    1000
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    1009

  4. 0

    Puede hacer que la IDENTIFICACIÓN estática, o usted podría hacer una clase principal llamada «Coordinar» (con ese ID de nuevo estática) con «Punto» de los niños, y el incremento de la ID en el constructor de cada «Punto» de objetos.

    Estática que parece como el camino a seguir.

Kommentieren Sie den Artikel

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

Pruebas en línea