web-dev-qa-db-ja.com

Javaクラス/静的メソッドの代わりにインスタンスメソッドを使用して、インスタンス化されたオブジェクトごとに一意のIDを作成します

これはかなり新しいので、タイトルに用語が含まれていることを願っています。

以下を実行するインスタンスメソッドを作成する方法を理解しようとしています。

--ID番号が返されます。

-各オブジェクトはクラスコンストラクター(インスタンス化?)から作成されるため、一意の整数ID番号が割り当てられます。最初のID番号は1で、新しいオブジェクトがインスタンス化されると、連続した番号が割り当てられます。

上記を行うクラス/静的メソッドの例を見つけることができますが、インスタンスメソッドでこれを行う方法を理解できません。私の試みは以下です:

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

}

私の主な方法は次のとおりです:

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


    }
}

わかりやすくするため、コード全体を含めていないことに注意してください。足りていれば幸いです。

また、Java.util.UUIDを使用したくありません。

7
SeesSound

現在の問題は、 'id'がインスタンス変数であること、つまり、作成したオブジェクトに属していることです。オブジェクトを作成するたびに、インスタンス変数の新しい新鮮なコピーが作成されると考えてください。したがって、オブジェクトを作成するたびに、IDは最初に0に設定され、次にポストが1ずつ増分されます(したがって、すべてのオブジェクトにはID = 0があります)。

たとえば、クラスで作成したすべてのオブジェクトを自動的にカウントする変数またはidを持つ変数を作成する場合は、クラス変数を作成する必要があります。これらの変数は、クラスから作成するすべてのオブジェクトに属し、そのために使用されるキーワードは「静的」です。

注:静的メソッドではなく静的変数を使用しました。静的をまったく使用しない場合は、別の質問です

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

}

キーワードを変更するだけで、プログラムが正しくなります。あなたはあまり複雑なことをする必要はありません。

クラスとオブジェクト、静的変数とインスタンス変数の概念を最初に理解することは困難です。さらに説明が必要な場合はお知らせください:)

5
CoderBC

IDシーケンスの維持は、オブジェクトの残りの部分とは別の責任であり、Coordinatesクラスのいずれのインスタンスにも属していないため、別のオブジェクトに属しています。シーケンスを維持し、番号を渡すための別のオブジェクトを作成します。

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

次に、そのシーケンスを使用してオブジェクトを初期化します。

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

ユーザー入力をモデルから分離しておくと、物事が簡単になりますが、ユーザーからの入力ではない場合は、Coordinatesクラスをインスタンス化することをお勧めします。コンソール入力はコンストラクターに入りません。あなたは次のようなCoordinateクラスを持っているかもしれません

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

のような主な方法

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

現在のコードのコンテキストでは、最も簡単なことは次のとおりです。

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

テスト

public class Test {

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

出力

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

2
Alan Hay

そのIDを静的にすることも、「Coordinate」という親クラス(そのIDが再び静的になる)を「Point」の子で作成し、各「Point」オブジェクトのコンストラクターでIDをインクリメントすることもできます。

静的な方法のように思えます。

0
pegas