Wörter-KarteiSystem/Vokabel Trainer Source Fragen

REC

Bekanntes Mitglied
Ich habe bereits einen anderen Thread eröffnet.

http://www.java-forum.org/codeschnipsel-u-projekte/104109-woerter-karteisystem-vokabel-trainer.html

Doch es wurde mir geraten ein neues Thema zu erstellen,in dem ich explizit Frage rein tun kann bei denen es um den Code geht.

Darum stelle ich auch hier noch einmal die Frage welche ich schon im anderen Thread gefragt habe.

Wie kann ich auf eine ArrayList in der Klasse Datenbank zugreifen von einer andern Klasse aus?
Ich kann ja in der anderen Klasse nicht noch ein Datenbank Objekt erstellen?
 
H

heinzHerbert

Gast
Da gibt es mehrere Möglichkeiten:

(1) Du deklarierst die ArrayList als "public static" in deiner Datenbank-Klasse. Dann kannst du darauf so zugreifen: Datenbank.arrayListName

(2) Du deklarierst die ArrayList als "private static" in deiner Datenbank-Klasse und erstellst eine getter-Methode "public static ArrayList getArrayList()". Dann kannst du darauf so zugreifen: Datenbank.getArrayList()

(3) Du deklarierst die ArrayList nicht mit "static". Dann musst du aber der Klasse, von der aus du auf die "Datenbank" zugreifen möchtest, irgendwie das Datenbank-Objekt bekannt machen. Das könntest du mit einem Parameter für den Konstruktor erledigen oder mit einer extra Methode.
 

REC

Bekanntes Mitglied
Ok,danke für die gute Antwort.

Trotzdem habe ich noch die eint oder andere Frage.

Also ich habe bereits die 1 Variante probiert.Es scheint das ist die einfache.Aber ich bekomme immer eine nullpointexecption.

Was genau ist der Unterschied zwischen der 1 und 2 Variante?Einfach wegen der Kapselung?private/public etc..?

Eben und die 3 Variante kann ich ja nicht benutzen da ich ja nicht nochmal eine ganze Datenbank anlegen kann.
 

Nicer

Bekanntes Mitglied
Der Unterschied ist dass du nicht auf die Variable direkt zugreifst , dass wenn du eine Variable für andere Klassen nicht sichtbar haben willst ( private ) aber trotzdem abrufen / schreiben willst benutzt du Getter únd Setter Methoden. Somit hat eine Fremde Klasse nicht direkten zugriff auf die Variable sondern nur auf die Getter / Setter methode
 
H

heinzHerbert

Gast
Eben und die 3 Variante kann ich ja nicht benutzen da ich ja nicht nochmal eine ganze Datenbank anlegen kann.

Wieso nochmal anlegen? Beide Variablen, die dadurch entstehen referenzieren auf die selbe ArrayList.

ein einfaches (sinnfreies) Beispiel:

Java:
public class MyDatabaseContainer {
    private ArrayList<String> myDatabase;

    public MyDatabaseContainer() {
        myDatabase = new ArrayList<String>();

        myDatabase.add("testEntry");
    }

    public MyDatabaseUser createDBUser() {
         MyDatabaseUser user = new MyDatabaseUser(myDatabase);

         System.out.println("Database content in MyDatabaseContainer:");
         for(String entry : myDatabase) System.out.println(entry);


         return user;
    }
}

Java:
public class MyDatabaseUser {
    
    private ArrayList<String> usedDatabase;

    public MyDatabaseUser(ArrayList<String> database) {
          this.usedDatabase = database;

          usedDatabase.add("testEntry2");

         System.out.println("Database content in MyDatabaseuser:");
         for(String entry : usedDatabase) System.out.println(entry);

    }
}

Wenn du jetzt auf einem MyDatabaseContainer-Objekt die Methode createDBUser() aufrust, wird damit ein neues MyDatabaseUser-Objekt erzeugt, das genau die selbe ArrayList enthält (Referenzen auf das selbe Objekt!). Zur Demo wird im Konstruktor von MyDatabaseUser die übergebene Liste modifiziert, der Inhalt der "neuen" Liste ausgegeben und dann der Inhalt der Liste von MyDatabaseContainer wieder ausgegeben, wenn d die Methode createDBUser() ausfrust.
 

REC

Bekanntes Mitglied
Ok,ein bisschen verzwickt aber ich denke ich habe die Idee verstanden.
Bei dieser Zeile
Java:
MyDatabaseUser user = new MyDatabaseUser(myDatabase);
wird die Variable(Referenz) der 1.Liste mitgegeben.Danach geht die 1.Liste in das Objekt der Klasse MyDataBaseUser


Java:
    public MyDatabaseUser createDBUser() {
         MyDatabaseUser user = new MyDatabaseUser(myDatabase);

         System.out.println("Database content in MyDatabaseContainer:");
         for(String entry : myDatabase) System.out.println(entry);


         return user;
    }
}

Danach wird die 1.Liste welche mitgeschickt wurde einer neuen Variable zugewiesen, und erweitert mit "testEntry2".
Java:
public class MyDatabaseUser {
    
    private ArrayList<String> usedDatabase;

    public MyDatabaseUser(ArrayList<String> database) {
          this.usedDatabase = database;

          usedDatabase.add("testEntry2");

         System.out.println("Database content in MyDatabaseuser:");
         for(String entry : usedDatabase) System.out.println(entry);

    }
}

Danach in der Klasse MyDataBaseUser,wird die Variable user zurückgegeben.Denn user hat nun die Liste in der beide Einträge gespeichert sind.

Was genau geschieht hier?
Java:
 public MyDatabaseUser(ArrayList<String> database) {
          this.usedDatabase = database;

Man muss also ,wenn man ArrayList übergibt den ganzen Typ komplett ausschreiben,auch welche Datentypen in der Liste gehalten werden.
this. müsste ich in diesem Fall nicht unbedingt werden?


So ich hoffe ich habe den Code richtig verstanden.
Da ich erst mit Java beginne finde ich diese Variante ein bisschen verzwickt.Wäre es denn in meinem Fall nicht einfacher mit der static Variante zu arbeiten?Ich deklariere die ArrayList Variablen als private static und mache get/set Methoden
Denn ich habe 5 ArrayList, die bearbeitet werden sollen die eben in der Datenbank Klasse liegen.Und eine andere Klasse greift drauf zu.
 
H

heinzHerbert

Gast
So ganz hast du's leider doch noch nicht.

Danach in der Klasse MyDataBaseUser,wird die Variable user zurückgegeben.Denn user hat nun die Liste in der beide Einträge gespeichert sind.

Nicht nur user hat die Liste! Sowohl das MyDatabaseUser- als auch das MyDatabaseContainer-Objekt haben sie. MyDatabaseUser kann sie über die Variable usedDatabase ansprechen und MyDatabaseContainer über die Variable myDatabase. Beide Variablen verweisen auf exakt die selbe Liste (die ist nicht doppelt vorhanden, wurde nirgendwohin verschoben).

Ist wie in einer Bibliothek: Dort steht ein Exemplar von einem Buch, das anhand seines Standortes identifiziert werden kann. Jetzt kann ja ein Bibliotheksbesucher einem Freund erzählen, wo dieses Buch in der Bibliothek steht. Damit wissen es zwei Personen. Aber das Buch ist immer noch nur einmal vorhanden. Wenn jetzt einer der beiden irgendwas in das Buch reinschreiben würde, würde es auch der andere sehen können und umgekehrt.

Und mit den Listen ist es das selbe Prinzip.

---------------------------

Was genau geschieht hier?

Java:
public MyDatabaseUser(ArrayList<String> database) {
          this.usedDatabase = database;

Man muss also ,wenn man ArrayList übergibt den ganzen Typ komplett ausschreiben,auch welche Datentypen in der Liste gehalten werden.
this. müsste ich in diesem Fall nicht unbedingt werden?

Hier schreibt sich das MyDatabaseUser-Objekt die ihm übergebene Adresse der Datenbank auf. Die Angabe des Typs an dieser Stelle ist einfach nur sauberer Code und sollte, wann immer möglich, gemacht werden.
Und ja, "this." müsstest du nicht benutzen.

---------------------------

Da ich erst mit Java beginne finde ich diese Variante ein bisschen verzwickt.Wäre es denn in meinem Fall nicht einfacher mit der static Variante zu arbeiten?Ich deklariere die ArrayList Variablen als private static und mache get/set Methoden
Denn ich habe 5 ArrayList, die bearbeitet werden sollen die eben in der Datenbank Klasse liegen.Und eine andere Klasse greift drauf zu.

Das kommt darauf an, ob die ArrayListen jetzt Objekt-unspezifisch sind oder nicht. Statt den ganzen Listen könntest du auch einfach das MyDatabaseContainer-Objekt an MyDatabaseUser übergeben und für die einzelnen Listen in MyDatabaseContainer getter- und setter-Methoden erstellen.
 

REC

Bekanntes Mitglied
Nicht nur user hat die Liste! Sowohl das MyDatabaseUser- als auch das MyDatabaseContainer-Objekt haben sie. MyDatabaseUser kann sie über die Variable usedDatabase ansprechen und MyDatabaseContainer über die Variable myDatabase. Beide Variablen verweisen auf exakt die selbe Liste (die ist nicht doppelt vorhanden, wurde nirgendwohin verschoben).

Ist wie in einer Bibliothek: Dort steht ein Exemplar von einem Buch, das anhand seines Standortes identifiziert werden kann. Jetzt kann ja ein Bibliotheksbesucher einem Freund erzählen, wo dieses Buch in der Bibliothek steht. Damit wissen es zwei Personen. Aber das Buch ist immer noch nur einmal vorhanden. Wenn jetzt einer der beiden irgendwas in das Buch reinschreiben würde, würde es auch der andere sehen können und umgekehrt.

Ach so :) Jetzt ist das mal klar!
Das Bibliothekbeispiel ist sehr gut vorstellbar!Ich dachte eben es wird was kopiert oder verschoben.Aber eigentlich wird ja nur die Adresse "weitergegeben".
Daher bleibt die Liste einzigartig.


Das kommt darauf an, ob die ArrayListen jetzt Objekt-unspezifisch sind oder nicht. Statt den ganzen Listen könntest du auch einfach das MyDatabaseContainer-Objekt an MyDatabaseUser übergeben und für die einzelnen Listen in MyDatabaseContainer getter- und setter-Methoden erstellen.

Also die ArrayListen halten Objekte.Nämlich die Kartenobjekte.
Ich soll diese Listen nun in einem Container speichern,und dann die get und set Methoden schreiben,um den Inhalt einer Liste abzufragen.Und dann,wenn ich die andere Klasse verwende muss ich nur die Variablen der Listen übergeben.



Nur mal zur Erklärung:) ,diese 5ArrayList sind wie 5 Fächer.Zuerst sind alle Karten in Fach1.Wenn eine Karte richtig beantwortet wird,wird sie in das nächste höhere Fach verlegt.Daher muss ich von ArrayList1,die Klasse Karte,wort1 anzeigen lassen können.Und dann die Eingabe des Benutzers mit wort2 vergleichen.





Sorry, und noch eine Frage.Weiter oben hast du erwähnt ich muss der Klasse welche die Klasse Datenbank nutzen will,ihr irgendwie bekannt machen.Entweder über einen Kontstruktor oder einer Methoden.Für diese 2 Varianten hast du mir ja extra einen neuen Code geschrieben.
Bei mir ist das ja die GUI Klasse.Und wenn ich einen new Gui(MyDatabaseContainer) schreiben würde,würde dies mir wieder ein neues Fenster zeichnen.Das heisst ich muss die GUI Klasse umstrukturieren?
 
Zuletzt bearbeitet:
H

heinzHerbert

Gast
Ich glaube, es ist wirklich besser, wenn du dich erst einmal etwas mehr in die Java-Thematik (was Objekte und dergleichen betrifft) einliest. Da gibt's das berühmte Buch Java ist auch eine Insel (kostenfreie Online-Ausgabe). Kapitel 3 und 6 dürften da für dich erstmal sehr relevant sein.

Sorry, und noch eine Frage.Weiter oben hast du erwähnt ich muss der Klasse welche die Klasse Datenbank nutzen will,ihr irgendwie bekannt machen.Entweder über einen Kontstruktor oder einer Methoden.Für diese 2 Varianten hast du mir ja extra einen neuen Code geschrieben.
Bei mir ist das ja die GUI Klasse.Und wenn ich einen new Gui(MyDatabaseContainer) schreiben würde,würde dies mir wieder ein neues Fenster zeichnen.Das heisst ich muss die GUI Klasse umstrukturieren?

Irgendwo rufst du den Konstruktor doch schonmal auf. Da musst du dem doch bereits den DatabaseContainer übergeben...

Du kannst für deine Gui-Klasse, statt den Konstruktor zu erweitern, natürlich auch einfach eine weiter Methode hinzufügen:

Java:
public class Gui {
   private MyDatabaseContainer databaseContainer;

   public void setDataBaseContainer(MyDatabaseContainer dbc) {
      databaseContainer = dbc;
   }
}
 

REC

Bekanntes Mitglied
Du wirst es nicht glauben aber diese Buch besitze ich bereits :oops:

Habe aber immer nur Kapitel 6 gelesen.Sicher ist das Buch ok,aber es ist eher ein Nachschlagewerk.Zum erklären ist es eher ein bisschen spärlich.

Aber ich habe dein Beispiel verstanden.Ich habe das mit der Referenz mal so hinbekommen.

Wie gesagt ich bin erst am Anfang aber ich denke durch üben bekommt man dann ein Gefühl für solche sachen.
Aber ich werde diese Kapitel nochmal durchlesen.

Danke für die Antworten
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
B String - Wörter finden, welches Punkt und entsprechender Pre / Suffix hat? Java Basics - Anfänger-Themen 30
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
S spezielle Wörter aus Liste entfernen Java Basics - Anfänger-Themen 2
J Wörter aus Textdatei suchen Java Basics - Anfänger-Themen 2
CptK Datentypen Verdrehte Wörter wieder herstellen Java Basics - Anfänger-Themen 21
CptK Variablen Wörter erschließen Java Basics - Anfänger-Themen 7
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
Orkanson Methoden String in Wörter zerlegen und Endungen der Wörter überprüfen. Java Basics - Anfänger-Themen 4
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
B Collections Java Wörter in String zählen und geordnet ausgeben Java Basics - Anfänger-Themen 10
E Datei einlesen und bestimmte Wörter ausgeben Java Basics - Anfänger-Themen 2
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
A Wie am effizientesten bzw. schnellsten Namen/Wörter sortieren? Java Basics - Anfänger-Themen 1
I String teilen und zwei Wörter generieren Java Basics - Anfänger-Themen 1
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
I String trennen und verschiedene Wörter holen Java Basics - Anfänger-Themen 6
T Eingegebene Wörter ausgeben? Java Basics - Anfänger-Themen 3
T Wörter mit @ als Zeichen finden Java Basics - Anfänger-Themen 13
J Alle Wörter der Länge n mit 0 und 1 Java Basics - Anfänger-Themen 17
G wörter speichern Java Basics - Anfänger-Themen 12
T Erste Schritte einzelne Wörter aus textdatei lesen... Java Basics - Anfänger-Themen 4
C Wörter aus einer txt datei lesen Java Basics - Anfänger-Themen 19
C String Arrays - häufigste Wörter Java Basics - Anfänger-Themen 10
T Erste Schritte Eingelesenen Satz - Wörter und Leerzeichen getrennt in 2x Array's Java Basics - Anfänger-Themen 7
B Input/Output Wörter zählen & sortieren Java Basics - Anfänger-Themen 9
S Buchstaben/Wörter im String zählen Java Basics - Anfänger-Themen 6
K Anzahl Wörter in Zeile Java Basics - Anfänger-Themen 24
F wörter trennen und in txt-file schreiben Java Basics - Anfänger-Themen 5
J Von einem String einzelne Wörter speichern Java Basics - Anfänger-Themen 6
A Wörter umgekehrten Reihenfolge ausgeben Java Basics - Anfänger-Themen 3
J Wörter in einem string zählen und die anzahl zurückgeben Java Basics - Anfänger-Themen 4
P Zwei Wörter vergleichen Java Basics - Anfänger-Themen 11
S Wörter zählen Java Basics - Anfänger-Themen 19
N Wörter zählen im String Java Basics - Anfänger-Themen 3
Screen Wie lese ich Wörter ein? Java Basics - Anfänger-Themen 6
G Wörter Zählen Java Basics - Anfänger-Themen 11
J Wörter im String zählen Java Basics - Anfänger-Themen 4
P wörter im string zählen Java Basics - Anfänger-Themen 9
G Häufigkeit der Wörter einer Webseite zählen Java Basics - Anfänger-Themen 7
C Wörter suchen Java Basics - Anfänger-Themen 4
M Anzahl von Wörter in einer eingelesenen Datei Java Basics - Anfänger-Themen 10
S Regex, Wörter ersetzen Java Basics - Anfänger-Themen 2
S Welche Bedeutung haben diese Wörter? Java Basics - Anfänger-Themen 2
S Zeilen, Zeichen, Wörter Java Basics - Anfänger-Themen 3
K Wörter zählen auf Internetseiten... die zweite Java Basics - Anfänger-Themen 4
A Vokabel abfragen Java Basics - Anfänger-Themen 3
O OOP Vokabel-Trainer Java Basics - Anfänger-Themen 54

Ähnliche Java Themen

Neue Themen


Oben