web-dev-qa-db-fra.com

Java crée un ID unique pour chaque objet instancié en utilisant des méthodes d'instance au lieu de méthodes de classe/statique

Tout à fait nouveau, j'espère avoir la terminologie appropriée dans le titre.

J'essaie de comprendre comment créer une méthode instance qui fera ce qui suit:

--Un numéro d'identification est renvoyé.

- Chaque objet étant créé à partir du constructeur de la classe (instancié?), Un numéro d’identification unique lui est attribué. Le premier numéro d'identification est 1 et, à mesure que de nouveaux objets sont instanciés, des numéros successifs seront attribués.

Je suis en mesure de trouver des exemples de méthodes class/static qui répondent à ce qui précède, mais je suis incapable de comprendre comment procéder avec une méthode d'instance. Ma tentative est en dessous:

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;
    }

}

Ma méthode principale est la suivante:

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());


    }
}

Veuillez noter que je n'ai pas inclus la totalité de mon code pour des raisons de simplicité et de facilité de suivi. J'espère avoir ajouté assez.

Je ne veux pas non plus utiliser Java.util.UUID.

6
SeesSound

Le problème actuel est que votre "id" est une variable d'instance, ce qui signifie qu'il appartient aux objets que vous créez. Pensez-y que chaque fois que vous créez un objet, une nouvelle et nouvelle copie de votre variable d'instance est créée. une fois (tous les objets ont donc un id = 0).

Si vous voulez créer une variable qui, par exemple, compte automatiquement tous les objets que vous avez créés dans une classe ou a son id, vous devez créer une variable de classe. Ces variables appartiennent à tous les objets que vous créez à partir d'un classe et le mot clé utilisé pour cela est «statique».

Remarque: j'ai utilisé une variable statique MAIS pas une méthode statique. Si vous ne voulez pas utiliser statique, c'est une question différente

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 changement de mot clé rendra votre programme correct. Vous n'avez pas à faire trop de choses compliquées.

Il est difficile d’abord de saisir le concept de classe et d’objets, de variables statiques et d’instance. Faites-moi savoir si vous souhaitez plus d'explications :)

3
CoderBC

La gestion d'une séquence d'ID est une responsabilité distincte du reste de ce que fait votre objet. Elle n'appartient à aucune instance de la classe Coordinates. Elle appartient donc à un objet différent. Créez un objet séparé pour gérer la séquence et distribuez des nombres, comme par exemple

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

utilisez ensuite cette séquence pour initialiser vos objets:

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

En outre, le fait de garder les entrées utilisateur distinctes du modèle simplifie les choses, vous souhaiterez peut-être instancier votre classe Coordinates dans les cas où l'entrée ne provient pas de l'utilisateur. L'entrée de la console ne va pas dans un constructeur. Vous pourriez avoir une classe de coordonnées comme

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 + ")";
    }
}

et une méthode principale comme

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());
    }
}

Dans le contexte de votre code actuel, la chose la plus simple à faire est la suivante:

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;
    }
}

Tester

public class Test {

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

Sortie

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

1
Alan Hay

Vous pouvez soit rendre cet ID statique, soit simplement une classe Parent appelée "Coordinate" (cet ID étant de nouveau statique) avec des enfants "Point" et incrémenter l'ID dans le constructeur de chaque objet "Point".

Statique semble être la voie à suivre.

0
pegas