2016-04-07 5 views
1

Ich habe eine Klasse mit vielen erweiterten Unterklassen:Wie erhalte ich eine eindeutige ID pro Klassenerweiterung?

class FirstImplementation extends Mother { [...] 
class SecondImplementation extends Mother { [...] 
class ThirdImplementation extends Mother { [...] 

Was ich versuche, ist eine einfache und leichte Art und Weise zu tun, die gleiche Implementierung zu wissen, ob zwei Instanzen von Mother Klasse:

Mother a = new FirstImplementation(); 
Mother b = new SecondImplementation(); 
Mother c = new FirstImplementation(); 

a.sameKindOf(b); // return false; 
a.sameKindOf(c); // return true; 

Meine Idee ist es, ein ganze Zahl ID-Feld in jeder Mother Instanz festgelegt, und es nur in sameKindOf Funktion vergleichen:

public class Mother { 
    private final int ID; 

    protected Mother(int ID) { 
     this.ID = ID; 
    } 

    public int getID() { 
     return this.ID; 
    } 

    public boolean sameKindOf(Mother other) { 
     return this.ID == other.getID(); 
    } 
} 

Jede Erweiterung von Mother soll den Konstruktor von Mother mit einer genauen ID aufrufen.

Meine Frage ist: Gibt es eine Möglichkeit, jedes Mal, wenn ich eine neue Erweiterung erstelle, automatisch eine andere ID zu geben, oder muss ich es selbst machen, indem ich in jeder Konstruktorklasse eine andere Nummer gebe?

Wenn nicht, gibt es einen einfacheren Weg, um zu erreichen, was ich versuche zu tun?

+1

In dieser speziellen Situation konnten Sie nicht 'instanceof 'alle verwenden. Sie könnten jedoch 'a.getClass() == b.getClass()' machen. –

+0

Wenn Sie den instanceof-Operator nicht verwenden möchten, verwenden Sie den Klassenvergleich. 'return this.getClass() == other.getClass();' –

+0

@TeemuIlmonen Wäre es so schnell wie ein Ganzzahlvergleich? Wenn ja, posten Sie Ihren Kommentar als Antwort und ich akzeptiere ihn. – Aracthor

Antwort

0

Wouldnt

public boolean sameKindOf(Mother other) { 
    return this.getClass().equals(other.getClass()); 
} 

die Arbeit machen?

0

Werfen Sie einen Blick auf java.util.UUID Klasse und seine statische Fabrik Methode public static UUID nameUUIDFromBytes(byte[] name). Ist das wonach Sie suchen?

1

Wenn Sie nur in ID-Stil Lösung interessiert sind ... Versuchen Sie, den folgenden Mechanismus zu verwenden:

In Ihrem Mother Klasse protected static int childClassesNumber; erklären. Es speichert die Anzahl aller einzigartigen Childs geladen wurde:

class Mother { 
    protected static int childClassesNumber = 0; 
    private final int ID; 

    protected Mother(int ID) { 
    this.ID = ID; 
    } 

    public int getID() { 
    return this.ID; 
    } 

    public boolean sameKindOf(Mother other) { 
    return this.ID == other.getID(); 
    } 
} 

Dann jedes Kind bekommt eindeutige ID zu gewährleisten, sollten Sie so etwas wie dies in jedem Kind verwenden (und das ist nicht gut):

class ChildOne extends Mother { 
    public static final int ID; 

    static { 
    ID = ++Mother.childClassesNumber; 
    } 

    public ChildOne() { 
    super(ID); 
    } 
} 

Die ID wird nur bei Klassenladestufe (nur einmal)

und (zum Beispiel) ChildTwo gegeben werden:

class ChildTwo extends Mother { 
    public static final int ID; 

    static { 
    ID = ++Mother.childClassesNumber; 
    } 

    public ChildTwo() { 
    super(ID); 
    } 
} 

Danach wird der folgende Code

System.out.println(new ChildOne().sameKindOf(new ChildOne())); 
System.out.println(new ChildOne().sameKindOf(new ChildTwo())); 

bekommt:

wahr

falsch

Dieser Mechanismus einen großen Nachteil hat - Sie static Initialisierung in jeder stellen sollte Kind. Der Boilerplate-Code und so weiter und so fort ... so würde ich Ihnen empfehlen, @Ash-Lösung zu verwenden)