Java Liste - Elemente aller Objekte

Enotsa

Lt. Commander
Registriert
Juli 2015
Beiträge
1.816
Hallo,

ich habe folgendes Problem und hoffe das mir evtl. jemand einen Schubs in die richtige Richtung geben kann.

Ich habe eine Klasse SimpleList die bei der Instanzierung ein Array erstellt. Mittels add() Methode kann ich Inhalte hinzufügen und über size() mir die Menge der Elemente innerhalb des Arrays ausgeben lassen.

Nun hab ich das Problem das ich der Klasse ein Attribut hinzufügen soll das die Elemente aller Objekte zusammenzählt und über eine Methode dann auslesen soll.

Ich hab leider keinen schimmer wie ich Instanz für Instanz aufsummieren soll. Wäre super wenn mich jemand in die richtige Richtung lotsen kann.
 
Beim Hinzufügen kannst Du den Zähler erhöhen. Ansonsten über das Array iterieren.
 
Ich weiß nicht, ob ich das Problem richtig verstanden habe, aber ich versuche mal mein Glück. :D

Attribute sind Zustände (Quasi die Variablen der Objekte). Da wird gar nix gezählt. Wenn, dann muss eine Methode das Zählen übernehmen. Dafür könnte man z.B. eine (statische) Variable als Zähler verwenden, die entweder jedes Mal beim Aufruf von add() um eins erhöht wird, oder via size() von allen erzeugten Objekten vom Typ SimpleList die Anzahl der Inhalte aufaddiert. Ersteres wäre imho leichter umzusetzen. Letzteres geht nur dann wirklich effektiv, wenn sämtliche SimpleList-Objekte in einer weiteren Liste erfasst werden, damit man gut durchiterieren und auswerten kann.

P.S.: Im Zweifel mal den Quellcode posten.
 
Um Gottes willen keine statische Variable! Soll man nur eine Instanz verwenden können?
 
Ich kann dir gerade nicht folgen. Warum keine statische Variable? Der Zähler wird nur ein einziges Mal benötigt. Je nach Verwendung macht es durchaus Sinn, den dann statisch zu deklarieren.
 
Wenn man zwei Listen hat und der einen was hinzufügt wird der Zähler für beide erhöht...
 
Ich hab das jetzt wie folgt gemacht

Attribut
Code:
private static int allElements = 0;

Für das Aufaddieren in den add Methoden
Code:
allElements++

Zum Auslesen
Code:
static int getTotalSize() {

		return allElements;
	}

Und in der Main ruf ich es wie folgt auf
Code:
SimpleList.getTotalSize()

Rechnerisch ist das Ergebnis mit den Testfällen richtig aber ob die Lösung das Gelbe vom Ei ist weiß ich nicht.
 
Erstelle mal ein zweites object mir einer anderen Groesse. Dann siehst du, den Effekt der static variable
 
Nun hab ich das Problem das ich der Klasse ein Attribut hinzufügen soll das die Elemente aller Objekte zusammenzählt und über eine Methode dann auslesen soll
.

  • Nehme mal an, mit "eine Methode" meinst du einen sogenannten Getter für eine private Variable
  • diese private Variable muss dann in der add() Methode um den hinzugefügten Wert erhöht werden (leuchtet ja wohl ein, dass man das in der add() Methode macht)
  • diese private Variable darf auf keinen Fall static sein, sonst kannst du nicht mehrere Instanzen (Listen) der Klasse anlegen
  • kurz gesagt: nichts darf hier static sein: weder der Getter, noch die private Variable

Ach ja noch was:
wenn du eine "dynamische Liste" brauchst, solltest du keine Arrays verwenden. Eine add() Methode und Arrays vertragen sich nicht so gut, lieber gleich List<T> verwenden. Da hast du "deine Methoden" gleich gratis alle mit.
 
Zuletzt bearbeitet:
Das Problem ist das die Methode getTotalSize() unabhängig von einer Instanz aufgerufen werden soll sprich die muss ja wenn ich nicht vollends daneben liege static sein. Wenn ich die variable jetzt nicht static setze kann ich ja mit der Methode nicht darauf zugreifen.
 
Ah, die Anforderung mit den Instanzen hatte ich übersehen.

Ich würde wenn möglich trotzdem versuchen, static zu entgehen. Z.B. in dem man eine (Singleton) Factory verwendet, die eine Facade für die Listenobjekte verwendet, um die Anzahl zu tracken. Ließe sich mit java.lang.reflect.Proxy umsetzen.
 
Ok ... dein Code macht aber

  • die Anzahl aller Werte aller Listen
Wenn du das wirklich brauchst, dann ist dein Code korrekt und effektiv.

Minimale Verbesserung: würde die private static Variable "totalSize" nennen, dann passt's auch mit dem Getter (oder "totalNrOfElements", dein Name "allElements" ist zu unpräzise und keine gute Bezeichnung für einen int-Wert)
 
Zurück
Oben