JAVA. Skapa ett 8 siffror långt "unikt" id. HJÄLP!

Permalänk
Medlem

JAVA. Skapa ett 8 siffror långt "unikt" id. HJÄLP!

Hej! Jag har nyss börjat programmera i java och stött på ett problem.
Jag måste generera ett 8 siffror långt tal, som string eller int. Talet får ej upprepas eller väljas igen, slumpmässighet spelar däremot ingen roll. Talet ska användas som id hos objekt. Mitt problem är att jag inte kommer på hur jag ska göra för att mitt tal ska öka med ett varje gång jag skapar ett visst objekt.
hmm.. luddig förklaring xD

-Men jag har alltså en klass.. när jag använder klassen så skapar jag ett objekt (en användare) och en ArrayList som kan fyllas med objekt(accounts).
-i klassen finns även en metod som skapar "accounts".
-accountsen ska tilldelas ett unikt id (ett nummer).

Varje gång jag skapar ett account till användaren så ska talet alltså öka med ett. Jag får det att funka för ett objekt (användare) genom att göra en typ av counter i klassen, men om jag skapar två användare så börjar countern om på noll för den nya användaren, även om jag skapat flera accounts innan. Countern ska alltså känna av varje gång ett account skapas, oavsett användare!

HUR gör jag detta? :S Hoppas ni förstår vad jag menar btw! ^^

Permalänk
Medlem

Gör en klass som hanterar användare med bla lägg till, ta bort funktioner och en counter som räknas upp varje gång du gör en ny. Som du har det nu skapas en egen counter för varje objekt.

Skickades från m.sweclockers.com

Visa signatur

Intel i7 2600K @ 4.5GHz | GeForce GTX 680 | ASUS P8P67 PRO | Corsair Dominator 16GB 1600MHz | Samsung 830 256GB

Permalänk
Medlem

Gör counter static.

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem

En global variabel:

public static int id = "10000001";

Sedan när du skapar nytt objekt:

dittObjekt.id = id; (eller hur du nu sätter det)
id +=1;

klart. Du bör alltså ha detta current-nummer i en "övre" klass, inte i varje person. Tex den klassen som skapar personerna/konton.

Visa signatur

Hackintosh?
Mac OSX Tweaks/Hacks?

--> Besök nya [B]groths.org[/B]

Permalänk
Medlem
Skrivet av Cindori:

En global variabel:

public static int id = "10000001";

Sedan när du skapar nytt objekt:
dittObjekt.id = id; (eller hur du nu sätter det)
id +=1;

klart. Du bör alltså ha detta current-nummer i en "övre" klass, inte i varje person. Tex den klassen som skapar personerna/konton.

Och vid flertrådning så bör man tänka till lite extra.

Permalänk
Medlem
Skrivet av Cindori:

En global variabel:

public static int id = "10000001";

Sedan när du skapar nytt objekt:

dittObjekt.id = id; (eller hur du nu sätter det)
id +=1;

klart. Du bör alltså ha detta current-nummer i en "övre" klass, inte i varje person. Tex den klassen som skapar personerna/konton.

Även om det är en lösning så kan jag inte riktigt hålla med, för d första behöver det absolut inte vara en global variabel, att ha den som static underlättar däremot men är fortfarande inget krav. Om man t.ex. har en singleton som skapar kontona så kan denna ha en icke-static id räknare.
Sen bör ID ej sättas med hjälp utav en setter då detta gör att det är möjligt att ändra ID:et i framtiden och sånt vill man oftast inte om det handlar om IDn.
Lättaste lösningar dock, gör en privat static idRäknare i din konto-klass, gör ditt id till final och ansätt det i kontruktorn med värdet från static räknaren.

public class Account { private static int idCounter = 1000; private final int idNumber; public Account(){ idNumber = idCounter++; } public int getIdNumber() { return idNumber; } }

På så sätt får varje konto automatiskt ett ID när det skapas och detta ID går aldrig att ändra.
Ingen hänsyn tas till trådning eller persistering mellan körningar dock, men det lär inte vara något krav antar jag

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Som så ofta är fallet så finns det hjälp i klassbiblioteket att lösa ens problem. Ett enkelt sätt att göra idgenereringen trådsäker är att använda sig AtomicInteger vars metoder alla är atomiska, det vill säga att alla operationer på klassen sker utan att någon annan metod kan påverka resultatet samtidigt.

Så om vi tar följande

Skrivet av Gnejs:

public class Account { private static int idCounter = 1000; private final int idNumber; public Account(){ idNumber = idCounter++; } public int getIdNumber() { return idNumber; } }

och hackar om det till en trådsäker variant

public class Account { private static final AtomicInteger idCounter = new AtomicInteger(1000); private final int idNumber; public Account(){ idNumber = idCounter.getAndIncrement(); } public int getIdNumber() { return idNumber; } }

//C

Permalänk
Medlem

Tack för alla svar!