Vector in vielen Klassen

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
Hallo,

ich fülle eine Vector in einer Klasse an (von einer externen XML- Datei) und brache diesen Vector dann in sehr vielen Klassen,
Momentan ist bei mir der Vector static und ich greife über Klassenname.Vectorname in allen Klassen darauf zu,

Ist das von Design her OK oder wie könnte ich das am Besten machen?

lg
 

Murray

Top Contributor
Das geht solange gut, wie a) der Inhalt des Vectors nur von der XML-Date anhängt und es b) auch nur eine Version der XML-Datei gibt. Dass es den Vector für eine XML-Datei nur einmal gibt, ist dann in Ordnung (und auch wünschenswert, denn das Einlesen kostet ja Zeit, und der Vector braucht auch Speicher).

Ich würde das in etwa so machen:
Code:
  private static final HashMap<String,Vector> vectors = new HashMap<String,Vector>();
 
  public static Vector getVector( File f) {
  	String path = f.getAbsolutePath();
  	Vector v = vectors.get( path);
  	if ( v == null) {
  	  v = readVectorFromFile( f);
  	  vectors.put( path, v);
  	}
  	return v;
  }
  
  private static Vector readVectorFromFile( File f) {
  	
  	Vector v = new Vector();
  	
  	/* ... */
  	
  	return v;
  }

Dieser Code berücksichtigt allerdings nicht, dass sich die XML-Datei evtl. während der Laufzeit ändern kann. Außerdem kann man evtl. ein Problem bekommen, wenn es sehr viele verschiedene XML-Dateien gibt; in diesem Fall wächst vectors immer mehr an.

BTW: gibt es einen Grund, warum du Vector verwenden willst und nicht List?
 

Marco13

Top Contributor
PollerJava hat gesagt.:
Hallo,
...
brache diesen Vector dann in sehr vielen Klassen,

... klingt, als würde DORT das eigentliche Problem liegen. Wozu brauchst den Vector in vielen Klassen? Kannst du den Vector nicht in EINER Klasse liegen lassen, und andere Klassen indirekt (und damit, ganz nebenbei, implementierungsunabhängig!) darauf zugreifen lassen?
 

PollerJava

Top Contributor
Ja das habe ich jetzt gemacht, allerdings ist der Vektor in der einen Klasse static und über eine Klassenmethode greife ich von der verschiedenen Klassen auf diesen Vekor zu,

Ist das vom Design her OK oder ist es eher besser, in jeder Klasse, in der ich Zugriff auf den Vektor haben will, eine Instanz der Klasse, die den Vektor besitzt, anzulegen,

Ich hab mir das momentan so gedacht, dass der Vektor ja für alle Objekte da ist und deshalb die den Vektor als Klassenvariable gesetzt,

lg
 

Marco13

Top Contributor
PollerJava hat gesagt.:
Ja das habe ich jetzt gemacht, allerdings ist der Vektor in der einen Klasse static und über eine Klassenmethode greife ich von der verschiedenen Klassen auf diesen Vekor zu,
Schlecht.

PollerJava hat gesagt.:
Ist das vom Design her OK oder ist es eher besser, in jeder Klasse, in der ich Zugriff auf den Vektor haben will, eine Instanz der Klasse, die den Vektor besitzt, anzulegen,
Auch schlecht.

Niemand kennt deine Klassenstruktur und das genaue Problem, aber sinngemäß könnte/sollte man es vielleicht so machen
Code:
class ClassWithElements 
{
    private Vector vector = ...
    public int getNumElements() { return vector.size(); }
    public Element getElement(int i) { return vector.get(i); }
}

class OtherClass
{
    private ClassWithElements classWithElements = REFERENZ auf die eine Instanz von ClassWithElements, die es gibt
    void foo()
    {
        Element element = classWithElements.getElement(0); // "indirekter" Zugriff auf den Vector
    }

}

class AnotherClass
{
    private ClassWithElements classWithElements = REFERENZ auf die eine Instanz von ClassWithElements, die es gibt
}

class YetAnotherClass
{
    private ClassWithElements classWithElements = REFERENZ auf die eine Instanz von ClassWithElements, die es gibt
}
Dass alle Klassen die eine Instanz kennen müssen, ist auch nicht so toll, aber wie man das vermeiden kann, ist eine Architekturfrage, die man nicht beantworten kann, wenn man nicht weiß, was du vorhast.
 

PollerJava

Top Contributor
naja, ich lese aus einer XML- Datei in den Vector ein und brauche die Daten dann in einigen Klassen,
das ist alles,

Das dachte ich mir eben, dass ich in jeder Klasse, in der ich auf den Vektor zugreifen will, eine Instanz benötige,

Wie kann ich das besser machen??

lg
 

Murray

Top Contributor
Mit der (Klassen-)Methode, die ich oben gepostet habe, kann man sich an jeder beliebigen Stelle eine Instanz des Vectors holen, ohne dass dabei wirklich mehr Instanzen erzeugt werden als notwendig; man braucht lediglich den Import auf die Klasse, in der die Methode deklariert ist.
 

Murray

Top Contributor
static ist aber doch nicht per se irgendwie böse. Ungünstig wäre hier nur, den Vector selbst static zu machen, weil man dann in einer VM nur noch eine Instanz haben kann.
 
G

Gast

Gast
Beim Lesen dieses Thread muß ich irgendwie immer an Singelton denken.

Es gibt ein Pattern, das Singelton Pattern, das sorgt dafür, das es von einem Objekt nur eine Instanz gibt. Richtig implementiert, wird auch nur einmal instanziiert. Das Funktioniert eigentlich recht simpel. Schau einfach mal nach Singelton und entscheide dann ob es vielleicht das ist was du haben möchtest
 

Wildcard

Top Contributor
Singelton ist hier definitiv falsch, weil es nicht darum geht zu verhindern das es mehr als eine Instanz gibt.
 

Marco13

Top Contributor
... und falsch angewendet wird es zur Struktur-Hölle. Wer mal ein Programm warten mußte, das aus einer losen Sammlung von Singeltons besteht, weiß, was ich meine. Aber hier könnte es sogar angebracht sein. Wer weiß.
 

Marco13

Top Contributor
@Wildcard: Wenn dieses Singleton sozusagen einzig und allein den Inhalt einer einzigen Datei auf der Festplatte bescheiben soll, könnte es nicht mal soooo falsch sein, aber ... ich mag Singletons nicht, weil sie (wie gesagt) zu schlechtem Stil verführen. Meistens kann man eine saubere, flexible Lösung finden.

EDIT: Hatte deine Nachfrage nicht gesehen. Da Singeltons auch static sind, ist beides IMHO nur in den seltenSTEN Fällen angebracht.

@PollerJava: Vielleicht(!) wäre es auch sinnvoll, den Vector an die Methoden zu übergeben, die ihn brauchen. (Nochmal: ) Wer weiß.
 

Wildcard

Top Contributor
@Marco13
ok, in einem sehr speziellen Szenario gebe ich dir recht.
Ich meide Singeltons wo immer möglich und auch hier ist sehr fraglich ob es eine brauchbare Alternative darstellt.
 

PollerJava

Top Contributor
Wildcard hat gesagt.:
Singelton ist hier definitiv falsch, weil es nicht darum geht zu verhindern das es mehr als eine Instanz gibt.

Das sehe ich aus so, Ich hab jetzt Singletons eingebaut, wos Sinn gemacht hat, z. B.: bei meiner CRCBerechnungs- Klasse, da will ich nur eine Instanz haben, ausserdem mag ich Singeltons auch nicht so, sie sind zwar praktisch, da man nicht lange nach einem Objekt einer Klasse suchen muss aber mit dem Erweitern is es dann halt so eine Sache,

Mein Stand ist momentan so:

Code:
private static Vector<ElementState> states;   // Vector

 public static ElementState getStatesElementAt(int index)   // Zugriff auf ein Element des Vectors
        {
        return states.elementAt(index);
        }
    
   public static int getStatesSize()               // Größe des Vectors, wurde mit trimSize() auf die wirkliche Größe angepasst
        {
        return states.size();
        }

Zugriff von den verschiedenen Klassen
Code:
Control.getStatesSize();
Control.getStatesElementAt(0). ...

Meine Überlegung ist halt, dass es diesen Vector in meinem Programm nur einmal geben soll (da sehr groß) und dass diesen Vector einige Klassen benötigen.
Wenn ich das Ganze nicht static mache, dann benötige ich sehr vielen Instanzen auf die Klasse, welchen den Vector beinhaltet und das find ich auch nicht sehr gut,

Könnte ich es so lassen oder gibts vielleicht noch eine bessere Lösung in meinem Fall,

lg
 

Murray

Top Contributor
Ob dein Vector bzw. die XML-Datei, aus der er erzeugt wird, in einer VM definitiv immer der gleiche ist, kannst nur du entscheiden. Wenn das gegeben ist, ist der Ansatz doch OK. Wenn in einer VM auch mehrere verschiedene Vektoren gleichzeitig gebraucht werden -> s.o. (Dateinamen bei der statischen get-Method übergeben, unter der Haube eine statische Liste führen, nur dann eine neue Instanz erzeugen, wenn noch keine passende Instanz in der Liste vorhanden ist)
 

Marco13

Top Contributor
PollerJava hat gesagt.:
Wenn ich das Ganze nicht static mache, dann benötige ich sehr vielen Instanzen auf die Klasse, welchen den Vector beinhaltet

Eben nicht. An jeder Stelle, wo genau dieser Vector verwendet wird, kannst du auch nur genau den einen Vector verwenden. Es kann ja mehrere Referenzen darauf geben. Und wie du die Referenzen an die Stellen bringst, wo sie benötigt werden, hatte ich dir schon gesagt: Entweder, du speicherst die Referenzen in den jeweiligen Klassen, oder übergibst die Referenzen an die jeweiligen Methoden, oder... du machst irgendwas statisches (so wie jetzt, oder mit einem Singleton) was beides nicht unbedingt schön ist.
 

Wildcard

Top Contributor
@PollerJava
Wenn man schon den Vector benutzt, dann sollte man ihn grunhdsätzlich nur über List oder Collection ansprechen.
Denn sonst passiert genau das was du hier demonstrierst. Man ist versucht Methoden des Vectors wie elementAt zu verwenden, die keinen Vorteil bringen, aber zu allen anderen Collections inkompatibel sind.
 

Marco13

Top Contributor
Nicht
Code:
private Vector data = new Vector();
sondern
Code:
private List data = new Vector();
nehmen - und entspechend bei Methoden nicht
Code:
void setData(Vector data) {...}
sondern
Code:
void setData(List data) {...}
Ganz pragmatisch: ÜBERALL nicht 'Vector' sondern 'List' schreiben. Die EINZIGE Ausnahme ist die Erstellung (mit "new Vector()")
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vector Strings in Array splitten Allgemeine Java-Themen 6
G Fehler mit Vector Allgemeine Java-Themen 3
M String Array Vector komprimieren und verschicken Allgemeine Java-Themen 3
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U Vector aus Oberklasse spezialisieren Allgemeine Java-Themen 2
R Vector in JList Allgemeine Java-Themen 11
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
H Index Out of Bounds bei Vector Allgemeine Java-Themen 4
H Java Vector Frage Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
C Vector/Point-Problem Allgemeine Java-Themen 3
M Buffer-Vector einzeln und zusammen synchronisieren Allgemeine Java-Themen 4
B Suchalgorithmus der Klasse Vector Allgemeine Java-Themen 5
X Vector Allgemeine Java-Themen 3
S 2D Vector speziell ausgeben. Allgemeine Java-Themen 2
S Vector in Vector gespeichert, wie greift man darauf zu? Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
R Vector.clear() oder neu initialisieren Allgemeine Java-Themen 3
S vector & strings Allgemeine Java-Themen 26
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
D Array oder Vector in Enum Deklarieren Allgemeine Java-Themen 3
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
G JComponent in Vector - wie klonen? Allgemeine Java-Themen 7
V Performancefrage int-Vector/Stack Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
S JList in Vector Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
MQue Vector<..> nicht verwenden Allgemeine Java-Themen 4
H Vector<Character> zu char[] castern Allgemeine Java-Themen 2
T Element aus Vector entfernen Allgemeine Java-Themen 4
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
M get Funktion von Vector Allgemeine Java-Themen 4
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
V NullPointerException bei Vector Allgemeine Java-Themen 2
E einfache Frage zu Vector Allgemeine Java-Themen 8
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
G Vector beim Initialisieren befüllen Allgemeine Java-Themen 4
G Vector addAll Allgemeine Java-Themen 5
B sorteiren von Datein nach Zeitstempel in einem Vector Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
MQue Vector Allgemeine Java-Themen 7
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
P Vector auf JTree Allgemeine Java-Themen 6
P dynamisches Array / Vector Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
T Vector und remove? Allgemeine Java-Themen 13
T Vector in JAVA ? Allgemeine Java-Themen 10
MQue Vector implementieren Allgemeine Java-Themen 2
MQue Vector<State> Allgemeine Java-Themen 2
O hilfe bei Vector frage Allgemeine Java-Themen 6
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H java.util.Vector langsam ? Allgemeine Java-Themen 5
H Vector<T>[] vecs = new Vector<T>[10]; geht nicht Allgemeine Java-Themen 2
N Java API java.util.vector Allgemeine Java-Themen 3
G Vector erweitern Allgemeine Java-Themen 4
S Vector sortieren nach Objekt-Info? Allgemeine Java-Themen 9
A Probleme mit Vector Allgemeine Java-Themen 6
M Vergleich im geordeten Vector und Methodenaufruf Allgemeine Java-Themen 2
J Vector - Wert ersetzen Allgemeine Java-Themen 14
J Vector - Boolean Allgemeine Java-Themen 24
M Vector zu einem byte[] Allgemeine Java-Themen 5
J Vector<Shape> Speichern [gelöst] Allgemeine Java-Themen 11
Y Array mit ID in Vector Allgemeine Java-Themen 6
T Vector <-> double Allgemeine Java-Themen 4
T ArrayList bzw. Vector per set-Methode? Allgemeine Java-Themen 3
T ArrayList oder Vector als Parameter? Allgemeine Java-Themen 7
M Vector add() unchecked? Allgemeine Java-Themen 5
M Probleme und Zeitdruck: Kunden-DB (Vector) Allgemeine Java-Themen 13
T Vector Array Allgemeine Java-Themen 5
M Kunden-DB mit Vector Allgemeine Java-Themen 9
J Vector sortieren Allgemeine Java-Themen 3
M Vector - contain Allgemeine Java-Themen 13
C String und char[] / String[] und Vector Allgemeine Java-Themen 21
N Vector -> 2Diminsonaler Array Allgemeine Java-Themen 10
N Alledateien in einem Ordner in ein Vector speichern Allgemeine Java-Themen 19
K Object nach Vector konvertieren Allgemeine Java-Themen 3
Z ResultSet in Array oder Vector schreiben! Allgemeine Java-Themen 2
C vector von vector sortieren Allgemeine Java-Themen 4
D Vector in String Allgemeine Java-Themen 5
J Von Collection zu vector Allgemeine Java-Themen 5
D Vector in Datei schreiben Allgemeine Java-Themen 18
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
H Vector in ein File-Array umwandeln Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Stresstest mit seeehr vielen Clients? Allgemeine Java-Themen 21
S Aufruf in Konsole mit beliebig vielen Argumenten? Allgemeine Java-Themen 18
M Problem beim laden von vielen Bildern Allgemeine Java-Themen 16
G Panel mit vielen Komponenten verbraucht viel Speicher Allgemeine Java-Themen 3
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21

Ähnliche Java Themen

Neue Themen


Oben