Datentypen Array mit dynamischer Länge?

ciber

Mitglied
Hey Leute,

ich bin neu in der Programmierung und beschäftige mich zurzeit mit folgendem:

Eine Hauptklasse (main) erstellt ein Kunde vom Datentyp Konto. Dann wird dem Kunden ein paar Informationen mitgegeben (Name, Geld usw.).

Jetzt frage ich mich folgendes.
1. Kann ich mein (unten stehendes Beispiel) irgendwie verändern, dass ich aus dem Konto ein Array mache?

2. Gibt es in Java die Möglichkeit ein Array mit dynamischer Größe zu erstellen? Da ich ja nicht wissen kann, wieviel Kunden ich haben werde.

3. Ich suche einfach eine Möglichkeit, Kunden gesammelt irgendwo zu lagern (Array?), ohne für jeden eine neue Variable zu deklarieren.

4. Besitzt das Programm in seiner jetzigen Form "Fehler", die man vermeiden sollte?

Vorweg: Ich besitze zurzeit noch keine Kenntnisse über Frames, Listen usw. Das Programm habe ich jetzt nur mit den Methoden erstellt, die mir zur Verfügung standen, um die ganzen Lektionen aus einem Tutorial mal angewandt zu haben. Dass das Programm in seiner jetzigen Form absolut unbrauchbar ist, ist mir klar *g* 🙂. Irgendwann kommt das ganze in mehrere Frames mit Buttons usw.

Hauptklasse:

Java:
import javax.swing.JOptionPane;


public class HauptKlasse {

	
	public static void main(String[] args) {
		
	    String[] options = {"Privatkunde","Geschäftskunde"};
	    int antwort_typ = 0;
	    String Name = "";
	    int Einzahlung = 0;
	    int KontoID = 0;
	    int i = 1;
	    
	    Konto Kunde;
		try {
			antwort_typ = JOptionPane.showOptionDialog(null, "Welcher Typ","Kontoerstellungstool", 1, 3, null, options, null);
			Name = JOptionPane.showInputDialog("Ihr Name: ");
			Einzahlung = Integer.parseInt(JOptionPane.showInputDialog("Wieviel Geld Starteinzahlung"));
			KontoID = (int) (Math.random()*1000000);
			
			Kunde = new Konto(KontoID, antwort_typ, Name, Einzahlung); 
					
            if(antwort_typ == 0)
            {
				Kunde.setM_TypString("Privat");
			}
            else
            {
            	Kunde.setM_TypString("Geschäftlich");
            }
			
			
			 Kunde.DatenAusgebenBank();
			
		} catch (Exception e) {
			System.out.println("Kritische Fehleingabe!");
		}
		
	}

}

Subklasse:

Java:
public class Konto {
		
	 // Variablendeklaration
	
	 private int m_KontoID = 0;
	 private String m_Name = "";
	 private int m_Typ = 0; // 0 = Privat, 1 = Geschäftlich
	 private String m_TypString = "";
	 private int m_Hoehe = 0;
	 
	 // Konstruktor
	 
	 public Konto(int ID, int Typ, String name, int einzahlung)
	 {
		 m_KontoID = ID;
		 m_Name = name;
		 m_Hoehe = einzahlung;
		 m_Typ = Typ;
	 }


    // Getter und Setter-Methoden
	 
	 
	public int getM_KontoID() {
		return m_KontoID;
	}

	public String getM_TypString() {
		return m_TypString;
	}


	public void setM_TypString(String m_TypString) {
		this.m_TypString = m_TypString;
	}


	public void setM_KontoID(int m_KontoID) {
		this.m_KontoID = m_KontoID;
	}



	public String getM_Name() {
		return m_Name;
	}



	public void setM_Name(String m_Name) {
		this.m_Name = m_Name;
	}



	public int getM_Typ() {
		return m_Typ;
	}



	public void setM_Typ(int m_Typ) {
		this.m_Typ = m_Typ;
	}



	public int getM_Hoehe() {
		return m_Hoehe;
	}



	public void setM_Hoehe(int m_Hoehe) {
		this.m_Hoehe = m_Hoehe;
	}
	 
	// Nützliche Methoden
	
	public void DatenAusgebenKunde()
	{
		System.out.println(m_Name + "\n" + m_Hoehe );
		System.out.println("-------------------------------------------------------");
	}
	
	public void DatenAusgebenBank()
	{
		System.out.println(m_KontoID + "\n" + m_TypString + "\n" + m_Name + "\n" + m_Hoehe);
		System.out.println("--------------------------------------------------------");
	}
	
	public void Erhoehen(int plus)
	{
		if(plus > 0)
		{
			m_Hoehe = m_Hoehe + plus;
		}
		else
		{
			System.out.println("Fehleingabe: Betrag muss größer 0 sein");
		}
		
	}
	
	public void Verringern(int minus)
	{
		if(minus < 0)
		{
			m_Hoehe = m_Hoehe + minus;
		}
		else
		{
			System.out.println("Fehleingabe: Betrag muss kleiner 0 sein");
		}
	} 
}
 
Einfach eine ArrayList erstellen wo du mit

Java:
liste.add(Object)

und

Java:
liste.remove(Object)

Einfach Objekte in deine Arraylist reinstecken und rausnehmen kannst, ohne vorher die Größe kennen zu müssen.
 
Benutze als Typ [c]List[/c]. Das ist ein Interface und wird z.B. von den Klassen LinkedList und ArrayList implementiert. Statt eines Arrays kannst du also z.B. folgendes schreiben:

Java:
  List<Konto> konten = new ArrayList<Konto>();
  konten.add(new Konto(...));

Die Liste wird dynamisch erweitert.
Vector sollte man nicht mehr benutzen, der ist veraltet. (Und gewöhne dir besser das [c]m_[/c]-Präfix ab. Das macht man in Java nicht).
 
Java:
private int m_Typ = 0;

Das so ein Typ ja nur bestimmte werde annehmen wird (in deinem fall Geschäflich und Privat), mach lieber einen Enum daraus:

Java:
enum KontoTyp {
    Privat,
    Geschaeftlich;
}

Das erspart Fehler und macht den Code besser und leichter verständlich!,

Den enum kannst du dann einfach verwenden:

Java:
private KontoTyp kontoTyp = KontoTyp.Privat;
 
Hey,

danke für eure Antworten.

Warum sollte man das "m_"Präfix nichtmehr benutzen?

In meinem Tutorial (Buch zu Java7) steht, dass man Membervariablen mit "m_" benennen sollte.
 
Warum sollte man das "m_"Präfix nichtmehr benutzen?

Namen sollen etwas darüber aussagen, um was es sich bei diesem Ding(*) handelt, nicht wo es definiert worden ist oder welchen Datentyp es hat. Die beiden letzteren Dinge können sich ändern, mal stellt sich heraus, dass man eine lokale Variable durch die ganze Klasse schleift, und man sie besser als Member-Variable definiert. Ein anderes Mal stellt sich heraus, dass eine Member-Variable nur an einer einzigen Stelle verwendet wird, und man sie besser lokal definiert. So auch mit dem Typ: Da wird aus dem Date ein Timestamp, und dann wechselt man zu Klassen von Joda-Time u.s.w. Aber was das Ding ist, wofür es wirklich gebraucht wird, ändert sehr selten sein "Wesen". Ein firstName ist ein Vorname, und wird aller Wahrscheinlichkeit noch in hundert Jahren als Vorname in der Address-Klasse hausen - egal ob als Member-Variable oder lokal, als String oder in einem spezialisierten "Name"-Typ.

Moderne IDEs machen es unnötig, auf Kosten der Lesbarkeit zusätzliche Informationen in die Bezeichner zu stopfen. Du kannst jede gängige IDE so einstellen, dass sie deine Member-Variablen rosa auf grünen Grund schrägfett blinkend darstellt, wenn du diese Information für so wichtig hältst (was sie in der Praxis nicht ist).

(*) Ich spreche ausdrücklich nicht nur von Variablen. Das alles gilt sinngemäß z.B. für die abscheuliche Unsitte, Interfaces etwa mit dem Präfix "I" zu kennzeichnen - als ob es mich interessieren würde und sollte, ob der BlubbService, den ich da zurückbekomme, ein Interface ist oder nicht - solange er die Methode hat, die ich aufrufen will.
 
Zuletzt bearbeitet:
Danke für die Erklärung Landei.

Mir ist aufgefallen, dass sich Java-Autoren in vielen Punkten widersprechen. Die Probleme hatte ich mit VBasic nicht.

Der eine Autor favorisiert AWT. Der nächste schreibt, dass man AWT nichtmehr nutzen sollte, da veraltet.
Der dritte nutzt Eclipse, der vierte NetBeans.

Aus einem Guß wirkt das nicht gerade und für Anfänger/in ist das auch nicht gerade zuträglich. Naja, was soll man machen 🙂.

Ich werde jetzt erstmal die Liste einfügen.
 
Wie alt ist das Buch denn? Swing baut auf AWT auf und man sollte eher auf Swing setzen (auf keinen Fall mischen). Ob du Netbeans, Intellij IDEA, Eclipse oder Notepad++ verwendest, ist für deinen Code an sich erstmal egal. Eine IDE hilft dir in erster Linie beim Programmieren und beinhaltet einfach einige nette Features, die dir das Leben erleichtern sollen.

In meiner Signatur findest du die Codeconvetions. Von dem [c]m_[/c] würde ich dir auch abraten. Ich würde mir in diesem Falle sogar überlegen, nicht eine andere Fachliteratur zu wählen.
 
Leider bekomme ich die Sache mit der Liste nicht hin.

Wenn ich die Zeile
Java:
Konto Kunde;

mit
Java:
ArrayList<Konto> Kunde = new ArrayList<Konto>();

ersetze und dann über

Java:
Kunde.add(new Konto(KontoID, antwort_typ, Name, Einzahlung));

einen neuen Kunden hinzufüge, funktioniert das soweit.

Allerdings kann ich auf keine Methoden der Klasse Kunde zugreifen.

Also

Java:
Kunde.DatenAusgebenBank();

funktioniert nicht. Wo liegt denn der Fehler?
 
variablen werden lowerCamelCase geschrieben:
Kunde=>kunde
antwort_typ=>antwortTyp

das gleiche gilt für Methoden:
Kunde.DatenAusgebenBank() => kunde.datenAusgebenBank()
----

Aber zu deinem Hauptproblem: Du hast 0..n Kunden in der Liste. Da musst du dir erst einen rausziehen, bevor du mit dem Kunden-objekt arbeiten kannst:

[japi]List#get(int)[/japi]

z.B.:
Java:
Konto konto=kunde.get(0);
konto.datenAusgebenBank();
 
Nicht unbedingt. Er besitzt nur ein anderes Verhalten als ArrayList!

Ja, aber dieses andere Verhalten lässt sich inzwischen besser erreichen ([c]Collection.synchronizedList[/c] oder besser noch [c]CopyOnWriteArrayList[/c]). [c]Vector[/c] ist damit völlig obsolet (ebenso wie [c]Hashtable[/c]).

Und da ich dich inzwischen genügend kenne um zu wissen, dass du mir nicht glaubst 🙂
Java theory and practice: Concurrent collections classes
 
Zuletzt bearbeitet:
Soweit ich das noch weiß, besitzt er aber auch ein anderes Resize-Verhalten. Er vergrößert das interne Array glaub ich in kleineren Schritten. Bin mir aber auch nicht mehr so sicher
Edit: Unser Prof schwärmte jedenfalls von Vector 😱
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben