Telefonliste mit interface implementieren

coldstone

Bekanntes Mitglied
Hallo liebe Java freunde,

ich bin dabei das programmiemren einer Telefonliste mit interfaces zu erlernen.
Nur komme ich nicht weiter. Und zwar macht mir meine klasse welches mein inreface implementiert problem.
Ihc habe folgenden konstruktor:

Java:
public class TelephoneEntry {

private String name;
private String nummer;

public TelephoneEntry(String name, String nummer) {
    this.name = name;
    this.nummer = nummer;
}}

Mein interface sieht so aus:

Java:
public interface TelephoneListSpec {
    
    public void add();
    public void remove();
    public void seek();
    public void identify();

}

Meine Klasse welches das interface implementiert:

Java:
public class TelephoneList implements TelephoneListSpec {

    @Override
    public void remove() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void seek() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void identify() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void add() {
        // TODO Auto-generated method stub
        
    }
}

und zuguter letzt meine Klasse mit der main metohde:

Java:
public class TelephoneTester {

    public static void main(String args[] ) {

        TelephoneList tl = new TelephoneList();

        TelephoneEntry te1 = new TelephoneEntry("Müller", "1212121212");

        TelephoneEntry te2 = new TelephoneEntry("Meier", "34343434");

        TelephoneEntry te3 = new TelephoneEntry("Heitmüller", "56565656");

        tl.add(te1);

        tl.add(te2);

        tl.add(te3);
}}


Bekomme unter Eclipse bei der Zeile tl.add(te1); eine Fehlermeldung, das die Methode add() in der Klasse TelephoneList nicht anwendbar ist.

Es wird dann folgender Code in TelephoneList eingefüht/vorgeschlagen:

Java:
public void add(TelephoneEntry te1) {
        // TODO Auto-generated method stub
        
    }

Diese add() methode soll ja aber nicht nur für den Eintrag te1 gelten sonder für alle te1-te3.
Irgendwas vertehe ich da was falsch glaube ich.
Für Hilfe wäre ich sehr dakbar.
 
Du definierst die Funktion add ohne Parameter, also kannst Du die auch nur ohne Parameter aufrufen. Wenn du da ein TelephoneEntry übergeben willst, dann solltest Du dies in dem Interface und der Implementierung auch entsprechend so schreiben.

Und in dem Vorschlag wird ja in TelephoneList so eine Funktion hinzugefügt. Der Name des Parameters ist dabei doch egal. Er schlägt Dir te1 vor, weil Eclipse davon ausgeht, dass das ein sinnvoller Name ist, da Du dies ja im Aufruf zu verwendet hast. (Vermute, dass Eclipse so eine Logic anwendet, aber ich selbst nutze Eclipse nicht.)
Aber du kannst die Funktion add natürlich mit beliebigen TelephoneEntry instancen aufrufen, egal wie diese denn nun im Parameter heissen.
 
Erstmal vielen dank für deine Antwort.

Ich glaube ich habe es verstanden. 🙂
Nur wie kann ich meinen Array in der Konsole ausgeben?
System.out.println(tl.toString);
gibt mir wieder einen (Objekt?) aus.
TelephoneList@2f92e0f4
 
TelephoneList@2f92e0f4
Als Vorschlag:
TelephoneEntry.java um
Code:
@Override
public String toString() {
    return "My name is " + this.name + " and my nummer is " + this.nummer;
    }
erweitern
Die add-Methoden dann mit
Code:
(TelephoneEntry te)
Und in TelephoneTester.java zu Testzwecken dann z.B.
Code:
System.out.println(te3);
 
....
[/CODE] erweitern
Die add-Methoden dann mit
Code:
(TelephoneEntry te)
...

Also es funktioniert schonmal, vielen dank.
Nur verstehe ich eins nicht.

Warum
Code:
(TelephoneEntry te)
???
Ich kann da jeden beliebigen parameter eingeben und es funktioniert trotzdem.
TelephoneEntry xyz funktioniert auch.
 
Ich verstehe nur nicht warum ich diesen parameter frei wählen kann/darf???
Ich wäre jetzt davon ausgegangen, dass dieser auch (TelephoneEntry te1) heissen muss.

Und mal zum Verständnis:

Ich habe doch Objekte mit Namen und Telefonnummern, die ich jeweils in te1, te2 und te3 speichere.
Diese werden dann in meine TelephoneList tl hinzugefügt.
Also um es zu verdeutlichen:

1. TelephoneList tl <------- te1
2. TelephoneList tl <------- te2
3. TelephoneList tl <------- te3

somit habe ich 3 Objecte in meiner Liste.

Wie kann ich diese denn mit der for:each schleife durchlaufen, damit ich damit arbeiten kann?

ich versuche es mit
Java:
for (String liste : tl) {

}

Oder kann ich die einträge in tl nicht mit der for:each schleife ansprechen????
 
Ja, es sind Objekte. Aber eigentlich fast alles sind Objekte. Listen sind auch Objekte. Daher ist man gerne etwas genauer.

Und dann hast Du z.B. eine Instanz von der Klasse TelephoneList. Oder Instanzen von der Klasse TelephoneEntry.

Und wenn Du eine for each schleife hast, dann muss da entweder ein array oder eine Instanz von Iterable verwendet werden.
Damit Deine TelephoneList in der for each Schleife verwendet werden kann, muss Deine Klasse also Iterable implementieren.
 
Ich verstehe nur nicht warum ich diesen parameter frei wählen kann/darf???
Ich wäre jetzt davon ausgegangen, dass dieser auch (TelephoneEntry te1) heissen muss.

Bei einem Parameter handelt es sich im Prinzip nur um eine lokale Variable. Sie ist nur innerhalb der Methode gültig. Du kannst sie benennen wir du willst, bzw. natürlich im Rahmen der Java-Spezifikation.

Java:
public foo(Object someObject) { // deklariert eine Parameter-Variable vom Typ Object
    // code
} // ab hier ist die Variable nicht mehr gültig

public bar() {
    Object aObject = new Object(); // deklariert eine lokale Variable vom Typ Object
   
    foo(aObject); // die an foo() übergeben wird. Wichtig ist nur, dass sie vom selben Typ ist.
   
    // unterstellen wir, dass die Methode getSpecialObject() als Rückgabewert ein Object liefert
    foo(objectList.getSpecialObject()); // dann kann dies auch an foo() übergeben werden.
}
 
Ich kapiere das mit dem iterables irgendwie nicht. Kann mir das bitte jemand vielleicht mal an einem Beispiel zeigen wie sowas auszusehen hat???

Hier mal mein bisheriger code:

Java:
import java.io.*;
import java.util.*;
    
public class TelephoneTester {

    public static void main(String args[] ) throws IOException {

        TelephoneList tl = new TelephoneList();

        TelephoneEntry kontakt = new TelephoneEntry("", "");

        System.out.println("Bitte geben Sie ein, was sie tun möchten:");
        System.out.println("1. Eintrag anlegen");
        System.out.println("2. Eintrag löschen");
        System.out.println("3. Nach einer Person scuhen");
        System.out.println("4. Eine Telefonnumer identifizieren");
        System.out.println("Zum beenden (exit) eingeben");

        
      
        while (true) {
            //Einlesen ueber die Konsole
                 String kommando = textEingeben("");
                 String[] teilen = kommando.split(" ");
                 String name = "";
                 String nummer = "";
                
      
          Iterator it;
                /**
           *switch Anweisung zum zuordnen des eingelesenen kommandos.
           *Ausgabe des kommando Befehls und nachfolgender argumente.
           *Break-point zum unterbrechen nach erfolgreicher suche.
           */
                 switch (teilen[0])  {

                 case "1":
                     kontakt.add(); 
                     break;
                 case "2":
                     System.out.println(kontakt);
               //Hier gibt er mir den die speicheradresse TelephoneEntry@279f2327 aus
Iterator????   
          
                    
                     break;
                 case "3":
                     System.out.println("3 ausgewählt");
                     break;
                 case "4":
                     System.out.println("4 ausgewählt");
                     break;
                 case "exit":
              //Verlassen des Programmes mit "exit"
                     System.out.println("Vielen dank und auf wiedersehen!");
                     System.exit(0); break;
              //Ausgabe fuer erfolglose suche
                 default:
                     System.out.println("Befehl nicht gefunden!");
                 }
             }
         }
           /**
            * Einlesen der Zeile ueber die konsole.
            * @param eingabe
            *        Strin uebergabe
            * @return eingelesene Zeile
            * @throws IOException
            *       Fehler abfangen
            */
         public static String textEingeben(String eingabe) throws IOException {
             //Erzeugen des Eingabestroms
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             //Warten auf Eingabe
             System.out.print("> " + eingabe);
             return br.readLine();
         }
}
 
Ich habe in meiner Klasse TelephoneEntry die methode add():

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class TelephoneEntry {
    
private String name;
private String nummer;

public TelephoneEntry(String name, String nummer) {
    this.name = name;
    this.nummer = nummer;
}

public String add() throws IOException {
    // TODO Auto-generated method stub
       //Erzeugen des Eingabestroms
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Warten auf Eingabe
    System.out.print("Bitte geben Sie den Namen der Person ein: ");
    return br.readLine();
}
}

Wenn ich jetzt das Programm ausführe und in meiner switch Anweisung "1" auswähle, bin ich davon ausgegeangen, dass die Methode add() in meiner Klasse TelephoneEntry aufgerufen wird.
So dass in der Konsole :
Bitte geben Sie den Namen der Person ein:
erscheint und ich einen namen eingeben kann.
Ist jetzt die Frage ob er dann mit kontakt.add() das eingelesene Speichert.
Das wollte ich überprüfen, in dem ich mein TelephoneEntry kontakt in der konsole ausgebe.
 
Ich würde das etwas anders machen.

Dein ursprünglicher TelephoneEntry ist grundsätzlich OK (es fehlen ggf. noch getter-Methoden). Eine Methode add(), die Daten von der Konsole einliest hat hier nichts verloren. Das ist nicht die Aufgabe dieser Klasse und muss separat behandelt werden.

Java:
public class TelephoneEntry {
    private String name;
    private String nummer;

    public TelephoneEntry(String name, String nummer) {
        this.name = name;
        this.nummer = nummer;
    }
}

Die einfachste Möglichkeit Daten vom Typ TelephoneEntry in einer Liste zu halten wäre so etwas:

Java:
List<TelephoneEntry> telephoneList  = new ArrayList<>();

telephoneList.add(new TelephoneEntry("Hans Dampf", "0815");

Das List-Interface von Java stellt alle gängig benötigten Listenmethoden bereit, so dass damit auch funktioniert:

Java:
for (TelephoneEntry entry : telephoneList) { // das ist eine enhanced for-Loop, die über alle Einträge iteriert.
    System.out.println(entry.getName());
}

Edit: Schau dir unbedingt mal an, welche Methoden "List<>" zur Verfügung stellt und was für Funktion diese haben:

https://docs.oracle.com/javase/7/docs/api/java/util/List.html
 
Zuletzt bearbeitet:
Ertmal vielen dnak für deine Hilfestellung.
Wenn ich das so implementiere, gibt eclipse unter case1 einen Fehler.

Java:
    case "1":
                     kontakt.add();
                     break;

Es wird kontakt.add(null) vorgeschlagen, aber das ist doch falsch. Er fügt ja dann nur "null" zu und greift doch nicht auf die add() methode, oder liegt der Fehler woanders?

Die API gibt ja folgendes an:
add(E e)

Was ist hier e und was ist E
 
Zuletzt bearbeitet:
Welchen Typ hat denn die Instanz "kontakt"?

Was ist hier e und was ist E

List<E> ist eine sogenannte generische Klasse, die nicht auf einen bestimmten Typen festgelegt ist. D.h. du legst bei der Definition der Variablen fest, welcher Typ in der Instanz gespeichert wird:

Java:
List<String> stringList = new ArrayList<>(); // eine Liste für Strings
List<Integer> integerList = new ArrayList<>(); // eine Liste für Integers
List<Object> objectList = new ArrayList<>(); // eine Liste für Objects

In der Doku steht E als Platzhalter für einen konkreten Typen und e ist der Name der Parametervariablen.

Deine Liste List<TelephoneEntry> telephoneList ist also dafür gedacht Instanzen von "TelephoneEntry" aufzunehmen. Dementsprechend erwartet "add()" natürlich eine konkrete Instanz als Parameter, siehe #17

Java:
Scanner scanner = new Scanner(System.in);

System.out.println("Geben Sie den Namen ein:");

String name = scanner.nextLine();

System.out.println("Geben Sie die Telefonnummer ein:");

String telephone = scanner.nextLine();

telephoneList.add(new TelephoneEntry(name, telephone));
 
Welchen Typ hat denn die Instanz "kontakt"?

[/CODE]
Es sind String´s. Bekomme auch die fehlermeldung bei Eclipse das es nicht für Strings anwendbar ist.

Es müsste doch dann wie folgt aussehen:

Java:
  case "1":
 kontakt.add(name, nummer); 
 break;

oder sehe ich das falsch?
 
Zuletzt bearbeitet:
Wenn ich aber einen List habe wie folgt:
Java:
List<TelephoneEntry> kontakt  = new ArrayList<TelephoneEntry>();

müsste ich doch mit der add() methode was hinzufügen können?
Was aber leider nicht klappt. Ich mache irgendwas falsch.

Mit
Java:
case "1":
      kontakt.add();
break;
funktioniert es leider nicht.
Bekomme unter eclipse folgende fehlermeldung:
The method add(TelephoneEntry) in the type List<TelephoneEntry> is not applicable for the arguments ()

ich denke ich muss kontakt.add(???????); hier was einfügen aber aber alle versuche waren erfolglos.
 
Java:
TelephoneEntry kontakt = new TelephoneEntry("", "");
List<TelephoneEntry> kontaktListe  = new ArrayList<TelephoneEntry>();

kontaktListe.add(kontakt);
 
Oder die hineingezogene Variante:
Java:
List<TelephoneEntry> kontaktListe  = new ArrayList<TelephoneEntry>();

kontaktListe.add(new TelephoneEntry("1", "2"));
 
Es sind String´s.

Du hast demnach irgendwo stehen String kontakt;???

Die Klasse "String" verfügt über keine Methode mit dem Namen "add()". Siehe immer auch die Doku: Java: String

Es müsste doch dann wie folgt aussehen:

Java:
case "1":
kontakt.add(name, nummer);
break;
oder sehe ich das falsch?

Vermutlich siehst du es falsch (zumindest sofern "kontakt" eine String-Variable ist).
 
Ok scheint soweit zu gehen. Nur wie kann ich über die Konsole objekte in meine Liste einfügen???

Java:
    case "1":
          kontaktListe.add(kontakt(name));
          break;

Java:
 private static TelephoneEntry kontakt(String kontakt) throws IOException {
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               //Warten auf Eingabe
               System.out.print("Bitte Namen eingeben: " + kontakt);
        return br.readLine();

Das habe ich zwar versucht, ist aber glaube ich völlig falsche richtung.
 
Nur wie kann ich über die Konsole objekte in meine Liste einfügen???

Ich zitiere mich mal selbst:

Java:
Scanner scanner = new Scanner(System.in);

System.out.println("Geben Sie den Namen ein:");

String name = scanner.nextLine();

System.out.println("Geben Sie die Telefonnummer ein:");

String telephone = scanner.nextLine();

telephoneList.add(new TelephoneEntry(name, telephone));

Du kannst das natürlich auch in eine separate Methode einbauen:

Java:
private static TelephoneEntry readFromConsole() {

    // code zum Einlesen von der Konsole

    return new TelephoneEntry(name, telephone);
}

Du versuchst in deiner Methode einen String zurückzugeben, wo ein TelephoneEntry zurückgegeben werden sollte.
 
Java:
private static TelephoneEntry kontakt() {

    // code zum Einlesen von der Konsole

Scanner scanner = new Scanner(System.in);

System.out.println("Geben Sie den Namen ein:");

String name = scanner.nextLine();

System.out.println("Geben Sie die Telefonnummer ein:");

String nummer = scanner.nextLine();

kontaktListe.add(new TelephoneEntry(name, nummer));

    return new TelephoneEntry(name, nummer);
}


Bei kontaktListe sagt er mir das ich "Create local variable kontaktliste"???
Aber ich habe doch eine kontaktListe:

Java:
public static void main(String args[] ) throws IOException {

        TelephoneEntry kontakt = new TelephoneEntry("", "");
        ArrayList<TelephoneEntry> kontaktListe  = new ArrayList<TelephoneEntry>();

Verstehe nicht warum er hier rummeckert
 
Deine Variable "kontaktListe" ist aber nur in der main-Methode bekannt. In deiner Methode "kontakt" hast du keinen Zugriff auf lokale Variablen aus anderen Methoden.
 
OK.

um es jetzt aber auszugeben mit
Java:
  for (TelephoneEntry entry : kontaktListe) { // das ist eine enhanced for-Loop, die über alle Einträge iteriert.
                         System.out.println(entry.getName());
                     }

muss ich noch die getName() methode definieren oder?
 

Zurück
Oben