Eigenen Objekt Pool

D

DerNeue

Gast
Hallo!
Ich habe vor, so etwas wie einen eigenen Objekt Pool zu machen. Und zwar habe ich Objekte (nennen wir sie mal Ding), die u.a. ein Feld "ID" besitzen, was einfach eine fortlaufende Nummerierung darstellt. Wenn ich jetzt mittels "new Ding()" ein neues Objekt erzeuge, soll geguckt werden, ob das Objekt eventuell schon vorhanden ist. Wenn ja, bekommt es die ID des schon vorhandenen. Wenn nein, bekommt es eine neue ID.
Im Code soll es also ungefähr so aussehen:
Java:
//So soll der Konstruktor aussehen
public Ding(String name, String eigenschaft) { ... }

Ding d1 = new Ding("neuerName", "neueEigenschaft");
System.out.println(d1.getID()); //Ausgabe: 0 -> weil Nummerierung mit 0 beginnt
Ding d2 = new Ding("zweiterName", "zweiteEigenschaft");
System.out.println(d2.getID()); //Ausgabe: 1 -> ID wurde inkrementiert
Ding d3 = new Ding("neuerName", "neueEigenschaft");
System.out.println(d3.getID()); //Ausgabe: 0 -> Ein Ding mit den dem Namen "neuerName" und der Eigenschaft "neueEigenschaft" wurde schon erzeugt
Geht sowas?
 

Ark

Top Contributor
Ich bin mir gerade nicht sicher, ob dem TO klar ist, was ein Objekt-Pool ist oder welche Rolle er spielt. (Vielleicht verstehe ich auch nur nicht, worum es gerade geht.) Ein Konstruktor kann, wenn überhaupt, nur Referenzen auf neue Objekte zurückgeben. Diese (neuen) referenzierten Objekte können niemals aus einem Pool kommen.

Zielführender dürfte es also sein, alle Konstruktoren private zu machen und nur statische Methoden zur Objekt"erzeugung" öffentlich zu machen. Diese können ja dann auch Referenzen auf schon einmal erstellte Objekte (sprich: Objekte aus einem Pool) zurückgeben.

Ark
 

Marco13

Top Contributor
So klar find' ich das nicht. Wenn man "new" aufruft wird ein neues Objekt erzeugt. Man könnte das höchstens emulieren, durch eine (statische) Factory, so dass man mit
Ding d = pool.create("bla","blu");
entweder ein schon vorhandenes oder ein neues Objekt bekommt (und das neue gleich für später in den Pool gelegt wird). Viel wichtiger ist aber die Frage: Was soll das mit dem Pool? Solche Sachen wie Pooling für Optimierungen sind i.a. kontraproduktiv, irgendwelche IDs sollte man IMHO immer hinterfragen, und spätestens, wenn der Pool dann irgendein global-galaktischer Verwaltungs-Gott sein soll, sollte man sich schon SEHR genau überlegen, ob es da nicht einen objektorientierteren Ansatz gibt...

EDIT: Hu, Arks Antwort war eben noch nicht da :oops: Aber geht ja in die gleiche Richtung...
 
G

Gast2

Gast
Ja per Konstruktor geht das natürlich nicht. Aber ich denke dass war auch eher als Beispiel zu verstehen.
Ich würd das auch über ne Factory lösen.
 

musiKk

Top Contributor
Laut dem ersten Post geht es doch nicht um Instanzen. Es ging darum, die ID des neuen Objektes in Abhängigkeit bereits bestehender Objekte eventuell neu zu belegen. Ob das nun sinnvoll ist oder nicht, lässt sich ja im Moment noch nicht absehen, aber machbar ist das allemal.
 
D

DerNeue

Gast
Mein Problem ist eigentlich, wie ich die Objekte ablege. Ich habe da eigentlich an eine HashMap gedacht. Als Schlüssel könnte man die Strings name und eigenschaft konkatenieren, da über diese beiden Strings das Objekt eindeutig identifiziert ist. Das bedeutet, immer wenn man von Ding ein neues Objekt erzeugen will, konkateniert man die beiden Strings und kann so gucken, ob schon ein Objekt erzeugt worden ist. Als Value wird dann das komplette Objekt abgelegt. Viel sinnvoller wäre es allerdings, dass ID der Schlüssel ist, was ja alleine vom Namen der Variable schon naheliegend ist. Vor allem, da ich durch die ID auch herausfinden möchte, welches Objekt sich dahinter verbirgt. Nur so könnte ich beim Erzeugen nicht herausfinden, ob ein Objekt eventuell schon vorhanden ist, da die ID ja noch nicht vergeben wurde.
Also ich versuch das Problem mal durch Code zu demonstrieren.
Java:
public class Ding {

    private String name;
    private String eigenschaft;
    private int id;

    public Ding(String name, String eigenschaft) {
        this.name = name;
        this.eigenschaft = eigenschaft;
    }   
 
    public void setID(int id) {
        this.id = id;
    }

    public boolean equals(Ding ding) {
        return name.equals(ding.getName()) && eigenschaft.equals(ding.getEigenschaft());
    }

    //getter und setter
}

public class DingFactory {
    
    private HashMap<Integer, Ding> ding_objects;
    private int current_id;

    public DingFactory() {
        ding_objects = new HashMap<Integer, Ding>();
        current_id = 0;
    }

    /* Gibt die bestehende oder neue ID zurück */ 
    public int addDing(String name, String eigenschaft) {
        if (ding_objects.containsValue(new Ding(name, eigenschaft))) {
            //Wie finde ich nun heraus, welche ID das schon abgelegte Ding besitzt?
        } else {
            ding_objects.put(current_id, new Ding(name, eigenschaft));
            return current_id++;
        }
    }

    public Ding getDing(int id) {
        return ding_objects.get(id);
    }

}
Also ich muss mittels den beiden Strings name und eigenschaft herausfinden, welche ID das Objekt besitzt, aber ich muss auch über die ID herausfinden, welches Objekt sich dahinter verbirgt. Wie kriege ich das hin?
 
D

DerNeue

Gast
Die addDing Methode muss so aussehen, ist ein kleiner Fehler drin.
Java:
public int addDing(String name, String eigenschaft) {
        Ding ding = new Ding(name, eigenschaft);
        if (ding_objects.containsValue(ding)) {
            //Wie finde ich nun heraus, welche ID das schon abgelegte Ding besitzt?
        } else {
            ding.setID(current_id);
            ding_objects.put(current_id, new Ding(name, eigenschaft));
            return current_id++;
        }
    }
 
D

DerNeue

Gast
Mir fällt gerade auf, tut es da nicht auch eine einfache ArrayList? Da ich den Index ja eh fortlaufend mache, kann ich ja auch gleich den Index der ArrayList nehmen und mit get(int index) sowie indexOf(Object elem) habe ich alle Methoden, die ich brauche.
 

Marco13

Top Contributor
Erstmal vorneweg: Die equals-Methode wird so nicht funktionieren. Lass' dir ggf. equals und hashCode (!) von Eclipse (bzw. deiner IDE) generieren.

Eine pragmatische Lösung wäre, beide Richtungen zu speichern: Eine Map von Ding auf ID, und eine von ID auf Ding. Aber irgendwie ist das immernoch so schwammig, weil (mir) noch nicht 100% klar ist, was das Ziel des ganzen sein soll. Mal ganz direkt: Wo und wann willst du die ID verwenden, wo du NICHT direkt das Objekt verwenden kannst?
 
D

DerNeue

Gast
Dann kann ich ja besser eine ArrayList nehmen.

Also das Ziel ist, dass ich anderen Objekten, die in eine Datenbank eingetragen werden, quasi einen Fremdschlüssel zu den Objekten Ding gebe und dazu verwende ich eben diese ID. Hinzu kommt, dass ich den Transfer in eine Datenbank über den Umweg einer Textdatei machen muss. Und da ist es eben am besten, wenn in der Textdatei einfach eine ID steht, die dann als Fremdschlüssel in eine Datenbank eingetragen wird.
 

freez

Top Contributor
Ich bin jetzt kein Fan von doppelter Datenhaltung, aber ich würde an der Stelle auch zweigleisig fahren. Einmal eine Map mit ID als Key und dein Objekt als Value (oder halt deine ArrayList) und dann ein Set, welches deine beiden Strings als ein String enthält. Ich würde aber noch weiter gehen:
Erstelle dir eine Klasse, die dieses Set und die Map enthält und dann Methoden, die sich um
Java:
put(Ding ding);
Ding get();
boolean contains(String s1, String s2);
kümmert.
 
D

DerNeue

Gast
Also ich habe jetzt alles mit einer ArrayList gemacht. Geht denke ich mal am einfachsten, da man auch nicht doppelt speichern muss. Dafür ist es von der Laufzeit wahrscheinlich etwas langsamer.
 

Marco13

Top Contributor
O(n) vs. O(1) - genau darum ging's ja... Aber wenn es nur um wenige Objekte geht, ist das vielleicht egal... Der Pool ist ja vermutlich eh ein Interface :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Addons im eigenen Programm Allgemeine Java-Themen 1
E Eigenen "Aufzählungstyp" erstellen - mit enum ? Allgemeine Java-Themen 18
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
dereki2000 Eigenen Zeichensatz benutzen Allgemeine Java-Themen 7
B JAVA Prozesse in einer eigenen Anwendung laufen lassen Allgemeine Java-Themen 9
J Java eigenen Button programmieren (ob Cursor im Rechteck ist oder nicht..../button pressed or not) Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
F Grundrechenarten mit eigenen Typen Allgemeine Java-Themen 9
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D eigenen eventListener Allgemeine Java-Themen 5
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
R Eigenen Comparator schreiben ? Allgemeine Java-Themen 10
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
thE_29 Java Prozesse der eigenen JVM Allgemeine Java-Themen 12
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
C Eigenen Layout Manager schreiben Allgemeine Java-Themen 7
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
M eigenen Desktop erzeugen Allgemeine Java-Themen 3
G hat jeder thread seinen eigenen stacktrace? Allgemeine Java-Themen 2
F Eigenen E-MailClient als Standart definieren Allgemeine Java-Themen 7
F "source not found" in eigenem Projekt mit eigenen Allgemeine Java-Themen 2
G ||| Textdateien aus dem eigenen Projekt lesen. Allgemeine Java-Themen 16
D close Problem bei meinem eigenen ToolTip Allgemeine Java-Themen 2
F Dateien auf dem eigenen Server verändern? Allgemeine Java-Themen 3
M Eigenen Datentyp erstellen Allgemeine Java-Themen 4
N Konsole im eigenen Java-Programm Allgemeine Java-Themen 4
N warning beim compilieren des eigenen TableRenderers Allgemeine Java-Themen 5
G Fenster durch eigenen Button minimieren Allgemeine Java-Themen 6
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
K Textdatei als Objekt Allgemeine Java-Themen 4
Viktim Classenname zu Objekt Allgemeine Java-Themen 4
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
O Klassen Bruch im gleichen Objekt Speichern Allgemeine Java-Themen 1
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
K Best Practice JFrame Objekt allgemein zugänglich machen Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
F Neues Objekt aus .CSV definition Allgemeine Java-Themen 3
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
C Objekt Datenverlust nach Methodenaufruf Allgemeine Java-Themen 9
H JavaFX Von einer Methode auf stage-Objekt zugreifen Allgemeine Java-Themen 3
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
P Konsoleneingabe übernehmen und Objekt instanzieren. Allgemeine Java-Themen 5
E Auf Java-Objekt aus anderer Instanz zugreifen Allgemeine Java-Themen 26
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
P Objekt Array in Datei Speichern Allgemeine Java-Themen 3
F Dynamisch ein Objekt einer bestimmten Subklasse erstellen Allgemeine Java-Themen 7
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
V Objekt löschen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben