Auf Klasse zugreifen

chuvak

Erfahrenes Mitglied
Ich lade alle Spieler aus der Datenbank in die Klasse Spieler ein, das Ganze findet in der Klasse DB statt.

Dies ist der Code:
Java:
// DB
 ArrayList<Spieler> spieler= new ArrayList();

    public ArrayList ladeSpieler() {
    try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT * FROM spieler");
        while (rs.next()) {
            spieler.add(new Spieler(rs.getInt("id"), rs.getString("name"), rs.getInt("score"));
        }
        rs.close();
        stmt.close();
    } catch (SQLException ex) {
        System.out.println("fehler");
        System.err.println(ex);
    }
   return spieler;
}


// Spieler
    int id, score;
    String name;

    public Spieler(int id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }
Wie kann ich jetzt von einer anderen Klasse aus auf Spieler zugreifen? Ich möchte z.B. die Methode spieler.getName() aus der Klasse View aufrufen, um einen bestimmten Namen zu bekommen.

Java:
// View
ArrayList<Spieler> spieler;

spieler.addAll(DB.ladeSpieler());
System.out.println(spieler.getName(5)); // hier wird mir ein Fehler angezeigt
 
Zuletzt bearbeitet:

sheel

I love Asm
Hi

Eine void-Funktion (ladeSpieler) als Parameter (addAll) zu verwenden ist seltsam...

Aber wie lautet eigentlich der Fehler der letzten Zeile?
 

chuvak

Erfahrenes Mitglied
Stimmt, habe return angepasst.
Der Fehler lautet einfach "Cannot find Symbol" bei getName, der kommt einfach von meiner IDE.
 

sheel

I love Asm
Ohne ungekürzten Code kann man da schwer was sagen.

Würde übrigens die DB-Arraylist im View weiterverwenden, statt eine Zweite anzulegen.
Verbraucht weniger Speicher und geht schneller.
 

chuvak

Erfahrenes Mitglied
Muss ich die Klasse Spieler in der Klasse View denn nicht "bekannt machen"?
Ich möchte ja aus der View aus spieler.getName() aufrufen.
 

sheel

I love Asm
Ah, stopp.
Java:
ArrayList<Spieler> spieler;
spieler.addAll(DB.ladeSpieler());
System.out.println(spieler.getName(5));
Du rufst getName für die Arraylist auf.
Das gibts nur in den einzelnen Elementen der Arraylist.
(Und die id ist irgendwie sinnlos, wenn es auf einzelne Spieler bezogen ist).

Das ganze Design ist irgendwie seltsam...
aber ohne mehr Code kann man sich keinen Überblick machen.
 

chuvak

Erfahrenes Mitglied
Ok, ganz einfach: Wie kann ich diese ArrayList, die ich in DB mit Inhalten fülle, an die View übergeben, um dort mit ihr arbeiten zu können?
 

sheel

I love Asm
Die Grundlage dazu hast du oben schon reineditiert.
Jetzt muss dafür doch nur noch
Java:
spieler.addAll(DB.ladeSpieler());
mit
Java:
spieler = DB.ladeSpieler());
ersetzt werden.

Aber das löst das getName-Problem nicht.
getName kann mit einer id nichts anfangen, und getName existiert in keiner ArrayList.
Da wäre angebrachter, in einer Schleife alles durchgehen und auf id prüfen. Wenn gefunden->Name.
Oder equals etc. auf die id ausrichten und per indexOf suchen lassen.
 

j2se

Erfahrenes Mitglied
Sofern die Klasse Mannschaft folgende Methode enthält

public class Mannschaft {
public List<Spieler> ladeSpieler(String mannschaft) {
List<Spieler> list = new ArrayList<Spieler>();
return list;
}
}

genügt bei der aufrufenden Klasse folgender Aufruf, um an die ArrayList ranzukommen:

List<Spieler> list = new ArrayList<Spieler>();
list = ladeSpieler("FCBayern");

Ein addAll ist völlig überflüssig. Abgesehen davon würde ich für die Spieler eine eigene Klasse Spieler und für eine Mannschaft die Klasse Mannschaft erstellen. Die Klasse Mannschaft verwaltet alle Spieler einer Mannschaft. Diese Klasse enthält auch die Methode findeSpieler(spieler). Solange es nicht klar ist, was Du mit den Spielern anstellen willst, lässt sich auch kein gutes Design empfehlen.

Sofern in der Anwendung ein schneller Zugriff auf ein bestimmtes Objekt benötigt wird, eignet sich z.B. eine HashMap besser als eine ArrayList, da das Objekt anhand des hashCode gefunden wird, ohne dass die Collection von Anfang bis Ende durchlaufen werden muss. Hierzu muss die Klasse Spieler die Methoden equals() und hashCode() überschreiben.
 
Zuletzt bearbeitet: