ubuntuusers.de

Java Objektorientierung und private Methoden

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

tomte

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

Hallo, ich habe ein Verständnissproblem, vielleicht kann mir jemand ein wenig helfen. Ich möchte folgendes machen:

Gegeben ist eine Klasse WordTester:

public class WordCounterTester {

    public static void main(String[] args) {
        String eingabe;

        WordCounter newWordCounter = new WordCounter();

        System.out.println("Bitte geben Sie Ihren zu pruefenden Text ein: ");
        eingabe = newWordCounter.getStringInput();
        newWordCounter.countWords();
    }
}

und eine zweite Klasse WordCounter

public class WordCounter {

    private void countWords(){
          System.out.println("Methode Count Words");
    }


    /**
     * Liest einen String von der Konsole ein.
     * @return Der eingelesene String.
     */
    public String getStringInput() {
        String input = "";
        InputStreamReader isr;
        BufferedReader br;
        isr = new InputStreamReader(System.in);
        br = new BufferedReader(isr);
        try {
            input = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(0);
        }
        return input;
    }
}

Von der WordTester aus rufe ich die Methode zur Dateneingabe auf, und speichere die einzugebenden Daten in der Variablen eingabe. Danach will ich den Inhalt übergeben an die Methode CountWords in der Klasse WordCounter. Die Methode ist aber private. Wenn ich sie auf public setze würde es ja gehen, darf ich aber leider nicht ändern.

Wie könnte ich denn vorgehen um diese Methode zu nutzen? thx Tomte

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

tomte schrieb:

Wenn ich sie auf public setze würde es ja gehen, darf ich aber leider nicht ändern.

Hä wie? Hausaufgabe oder sowas?

Egal du kannst einfach eine zweite Methode schreiben countWordsPublic, die einfach nur die private Methode aufruft.

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

Ja, es geht um eine Aufgabe für die Uni.

Dein Vorschlag leuchtet mir ja ein, aber da weiss ich jetzt schon das ich die Aufgabe Postwendend wieder zurück bekomme.

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Wie genau lautet denn überhaupt die Aufgabenstellung?

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

Naja, das ist natürlich nur ein Teil der Aufgabe. Dazu gibt es diese Anforderung:

WordCounterTester: liest Textzeile ein und übergibt diese an WordCounter zur Verarbeitung.

WordCounter: zählt die Wörter und gibt das Ergebnis aus.

Soweit der Aufgabentext dazu. Die Methode CountWords ist vorgegeben und muss verwendet werden.

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

Stimmt währe für ne UNI-Aufgabe zu einfach gelöst. Unter C++ kann man die Klassen als friend definieren, geht das eventuell auch unter Java?

Edit: Achso, du kannst doch beide Methoden in die gleiche Klasse stecken. Oder wurde das explizit untersagt?

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

Nein leider geht das auch nicht.

WordCounterTester: liest Textzeile ein und übergibt diese an WordCounter zur Verarbeitung.

gotoubuntu

Anmeldungsdatum:
20. Dezember 2008

Beiträge: 73

In der Aufgabenstellung steht das du die Textzeile in WordCounterTester einlesen sollst, das machst du aber in WordCounter. Oder ist die Methode getStringInput() in der Klasse WordCounter auch vorgegeben?

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

@gotoubuntu tja, du hast mich erwischt. Die Methode getStringInput() sollte eigentlich in der Testerklasse stehen. Das habe ich aber nicht hinbekommen (räusper) also habe ich sie rübergeschoben in die andere Klasse. (Dann gehts.) Ein weiteres Problem von mir, aber das hat ja mit meiner Anfrage erstmal nix zu tun oder?

Die methode getStringInput() ist uns vorgegeben worden, damit wir Sachen einlesen können. Ich verstehe sie also nicht bis ins letzte, sondern benutze sie nur.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@tomte: Die exakte Aufgabenstellung + den exakten vorgegebenen Quelltext würde ich ja gerne mal sehen. Sonst weiss man ja nicht, ob Du nicht irgendwo schon einen Interpretationsfehler oder eine falsche Annahme gemacht hast. Desweiteren kommte es durchaus vor, das Aufgaben und Beispielquelltext fehlerhaft sind. Gerade bei Dozenten oder Tutoren, die der Meinung sind, sie können das im Schlaf und brauchen Quelltext nicht ausprobieren – der wird schon stimmen. Also im Zweifelsfall ruhig auch mal beim Tutor oder Dozenten nachfragen.

Kann es nicht ganz simpel sein, dass Du in der WordCounter einfach nur eine Methode printWordCount(String) implementieren sollst!?

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

Ok, ich dachte das es eine ganz einfache herangehensweise gäbe. Aber scheinbar ist privat wirklich private bei Java. (Wie gesagt ich bin Anfänger.) Also hole ich mal ein wenig weiter aus. Hier also meine Aufgabe:

Schreiben Sie ein Prog, das als Parameter eine Textzeile überreicht bekommt und das die Häufigkeit der darin vorkommenden Wörter zählt. Die Eingabe WordCountTester "was wahr ist, ist wahr, und was falsch ist, ist falsch." soll z.B. zu folgender Aussage führen:

was: 2 Wahr: 2 ist: 4 und: 1 falsch: 2

1. WordCountTester: liest Textzeile ein und übergibt diese an WordCounter zur Verarbeitung. 2. WordCounter: zählt die Wörter und gibt das Ergebnis aus. 3. WordTable: speichert die Elemente in einer Liste. 4. WordElement: Wort mit Häufigkeit

Das ganze soll mit folgenden Programmschnipseln gemacht werden:

public class WordCounterTester {
}
public class WordCounter {

    private void countWords(){
        WordTable table = new WordTable();
        String word;

        do{
            word = nextWord();            // get the next word
            if (!word.equals("")) {       // there is a next word?
                table.count(word);        // count the word in the table
            }
        } while (!word.equals(""));       // when there was a word try again
        table.print();                    // print entire table
    }
}
public class WordTable {
}
public class WordElement {
    /**  */
    private String word;
    /**  */
    private int count;

    /**
     *
     *
     *
     */
    public wordElement(String word) {
        this.word = word;
        count = 1;                        // initialize with 1 at creation
    }
}

Kelloggs

Anmeldungsdatum:
17. April 2007

Beiträge: 240

Wohnort: Freiburg

Vielleicht habe ich die Aufgabe auch missverstanden, aber wieso übergibst du den eingelesenen String nicht einfach an einen von dir implementierten Konstrutor der Klasse WordCounter? Irgendwie muss der String auf jeden Fall übergeben werden und der Konstruktor ist, da die dafür namentlich vorgesehene Methode private ist, wohl die eleganteste Lösung.

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

@ Kellogs Der Konstruktor. Ein Brief mit sieben Siegeln für mich.

Ich würde also in der TesterKlasse den Konstruktor anlegen. Danach mit WordCounter newWordCounter = new WordCounter(); ein neues Objekt erzeugen?

Und dann kann ich auch auf die Privaten Methoden zugreifen? Weil mir die Variablen dann in dem neuen Objekt zur Verfügung stehen? (Durch den Konstruktor?) Wäre das so richtig gedacht?

Kelloggs

Anmeldungsdatum:
17. April 2007

Beiträge: 240

Wohnort: Freiburg

Der Konstruktor ist die Methode einer Klasse, die bei Instatiierung aufgerufen wird (einfach gesprochen).

Deine Klasse WordCounter könnte also einen Konstruktor

public WordCounter(String enteredString) { [...] }

haben. Du würdest deinen WordCounter dann mit

WordCounter myCounter = new WordCounter(enteredString);

initialisieren und könntest im Konstruktor die Tabelle anlegen und die Wörter zählen lassen und was da noch alles gefordert ist.

tomte

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 128

ich habe das jetzt mal so gemacht, trotzdem lässt mich die Methode countWords() in der Klasse WordCounter() nicht rein wenn ich sie von WordCounterTester aus aufrufe. Wegen der zu übergebende Variable beschwert er sich nicht, aber ich habe einfach keinen Zugriff auf die private Methode WordCounter().

Die Fehlermeldung: C:\vfh\PA3>javac WordCounterTester.java WordCounterTester.java:36: countWords() has private access in WordCounter newWordCounter.countWords();

Antworten |