Java leidiges Thema - static und non static, Frage zum Code

Endless Storm

Commander
Registriert
Dez. 2008
Beiträge
2.158
Hallo,

ich habe ein Problem, und zwar bin ich über static und non-static noch nicht so ganz im klaren :(

Wir sollten einen Terminplaner basteln, das funktioniert auch ganz gut. Aber der Prof hat folgendes dazu geschrieben:

Bitte alle Attribute private und Zugriffsmethoden public. Auch in der UI-Klasse. Erzeugen Sie dann in main eine Instanz dieser Klasse, anstatt dieses instanzlose Programm. Das ist keine optimale Lösung, da kann nie jemand die Klasse weiterverwenden, integrieren, usw. Das entspricht nicht oo-Programmierweise.

Die Methoden habe ich bereits auf public gesetzt, aber welche Attribute müssen auf private gesetzt werden? Und mit dem rest werde ich auch nicht so recht schlau. In der Main wird doch bereits ein Objekt vom Typ Termin erzeugt und in die ArrayList gesetzt. Damit das funktioniert, musste ich allerdings vom TerminplanerUI ein Objekt erzeugen... das war ein Tip eines befreundeten Informatikers... Verstehen tue ich diesen Schritt nicht, sowas machen wir auch in keinem der Beispiele bisher.

Vielleicht könnt ihr mir weiterhelfen, was nicht optimal programmiert ist und wie ich das mit dem Objekterstellen vom TerminplanerUI umgehen könnte. Lasse ich das erzeugen vom Objekt TerminplanerUI weg, erhalte ich static-probleme...

Zum Programm:
Wir sollen uns selbst als Termin voreinstellen, dann weitere über die Konsole eingeben können, welche er in der korrekten Reihenfolge abspeichert, dann sollen wir alles ausgeben (in der richtigen Reihenfolge).

Hinweis: Das Paket Console enthält u.a. den Scanner für die Konsoleneingaben
Hier mal die Klassen:

Code:
import inout.Console;
import java.util.ArrayList;

public class TerminplanerUI
{
    private ArrayList neueListe = new ArrayList();

    //main
    public static void main (String args[])
    {
        TerminplanerUI starte = new TerminplanerUI();
        starte.neueListe.add(new Termin("Geburtstag: ***", 2013, 9, 15));
        
        starte.hauptmenue();
    }

    //Auswahlmenü
    public void hauptmenue()
    {
        char auswahl;

        druckeLinie();
        System.out.println("Bitte wählen Sie zwischen folgenden Funktionen:\n\n" + 
            "Neuer Termin: 1\nTermine anzeigen: 2\nAnwendung beenden: 3");
        druckeLinie();

        auswahl = Console.readChar();
        switch (auswahl)
        {
            case '1':
            anlegenTermin(); break;
            case '2':
            anzeigenTermin(); break;
            case '3':
            druckeLinie();
            System.out.println("Die Anwendung wurde beendet.");
            druckeLinie();
            break;
            default:
            {
                System.out.println("Keine gültige Eingabe.");
                hauptmenue();
            }
        }

    }

    //häufig verwendete Linie als Methode
    public void druckeLinie()
    {
        System.out.println("-----------------------------------------------");
    }

    //anlegen von Terminen, sortieren nach Datum, abspeichern in ArrayList
    public void anlegenTermin()
    {
        int eingabeJahr, eingabeMonat, eingabeTag, i = -1, index = 0;
        String eingabeTitel;

        System.out.println("Bitte geben Sie den Termin ein:\nJahr:");
        eingabeJahr = Console.readInt();
        while (true)
        {
            System.out.println("Monat:");
            eingabeMonat = Console.readInt();
            if (eingabeMonat >0 & eingabeMonat <13)
            {
                break;
            }
            System.out.println("Bitte nur Monate von 1 - 12 verwenden.");
        }

        while (true)
        {
            System.out.println("Tag:");
            eingabeTag = Console.readInt();
            if (eingabeTag >0 & eingabeTag <32)
            {
                break;
            }
            System.out.println("Bitte nur Tage von 1 - 31 verwenden.");
        }

        System.out.println("Terminbeschreibung:");
        eingabeTitel = Console.readString();

        for (Object temp: neueListe)
        {
            Termin termin = (Termin)temp;

            i++;
            if (termin.getJahr() < eingabeJahr)
            {
                index = i+1;
                continue;
            }
            else if (termin.getJahr() > eingabeJahr)
            {
                index = i;
                break;
            }
            else if (termin.getMonat() < eingabeMonat)
            {
                index = i+1;
                continue;
            }
            else if (termin.getMonat() > eingabeMonat)
            {
                index = i;
                break;
            }
            else if (termin.getTag() > eingabeTag)
            {
                index = i;
                break;
            }
            else
                index = -1;
        }
        if (index == -1 || index > neueListe.size())
            neueListe.add(new Termin(eingabeTitel, eingabeJahr, eingabeMonat, eingabeTag));
        else
            neueListe.add
            (index, new Termin(eingabeTitel, eingabeJahr, eingabeMonat, eingabeTag));

        hauptmenue();
    }

    //anzeigen der gespeicherten Termine
    public void anzeigenTermin()
    {
        int anzahl = 1;

        for (Object temp: neueListe)
        {
            Termin termin = (Termin)temp;
            System.out.println("Termin: Nr. " + anzahl + 
                "\nDatum: " + termin.getTag() + "." + termin.getMonat() + "." +
                termin.getJahr() +
                "\nBeschreibung:\n" + termin.getTitel() + "\n");
            anzahl++;
        }
        hauptmenue();
    }
}

Code:
public class Termin
{
    private String titel;
    private int jahr, monat, tag;

    //Termin anlegen mit Parametern
    Termin(String titel, int jahr, int monat, int tag)
    {
        this.titel = titel;
        this.jahr = jahr;
        this.monat = monat;
        this.tag = tag;
    }

    //Lesende Operationen
    String getTitel()
    {
        return titel;
    }

    int getJahr()
    {
        return jahr;
    }

    int getMonat()
    {
        return monat;
    }

    int getTag()
    {
        return tag;
    }
}
 
Zuletzt bearbeitet:
Ist doch korrekt so wie ich das sehe.

Du erstellst ein Objekt von TerminplanerUI damit du dessen Methoden nutzen kannst.
Würdest du das nicht tun müsste die ArrayList und alle Methoden als static deklariert werden, was aber natürlich vermieden werden soll und in deinem gezeigten Code ja auch schon so ist.
Warum du das auch tun sollst ist einfach die Tatsache, das du jetzt eine andere Klasse schreiben, bspw. TerminplanerUIExtended und ein Objekt davon erstellen könntest, dem du dann dein TerminplanerUI Objekt mitgeben könntest, sodass deine neue Klasse und das erstellte Objekt darauf zugreifen kann.

Private gehören in aller Regel eben Variablen wie deine ArrayList, aber die ist es ja schon.
Zusätzlich könntest du Methoden wie druckeLinie als private deklarieren, weil sie wahrscheinlich nie jemand von außen aufrufen möchte.

Wenn es funktioniert, sollte es da eigentlich nichts mehr zu tun geben.

Edit: Was Apooo schreibt ist auch zu beachten, klar.
 
Also ich denke der Prof will, dass du die main-Methode in eine extra Klasse schreibst. Dadurch trennt man die Klassen von dem ausführenden Programm. Wird halt etwas übersichtlicher.

Die getter/setter-Methoden in der Termin-klasse müssen noch auf public. Sonst passt das alles mit private&public (soweit ich das sehe).
 
Endless Storm schrieb:
Vielleicht könnt ihr mir weiterhelfen, was nicht optimal programmiert ist und wie ich das mit dem Objekterstellen vom TerminplanerUI umgehen könnte. Lasse ich das erzeugen vom Objekt TerminplanerUI weg, erhalte ich static-probleme...

Warum willst Du das Objekt-Erstellen umgehen? Will man nicht alles static machen, und das will man fast nie, muss zu irgendeinem Zeitpunkt ein Objekt erstellt werden. Der Prof weist doch auch extra darauf hin!?

Um auf die nicht-statischen Methoden etc. eines Objektes zugreifen zu können, muss man erst eine Instanz erzeugen. Ganz wie im richtigen Leben. Viel mehr gibt es hier nicht zu wissen.
 
Danke erstmal für eure Antworten. Aber ich verstehe dennoch nicht, was der Prof hiermit meint:
Erzeugen Sie dann in main eine Instanz dieser Klasse, anstatt dieses instanzlose Programm. Das ist keine optimale Lösung, da kann nie jemand die Klasse weiterverwenden, integrieren, usw

Ich war davon ausgeganen, dass man kein Objekt von der Klasse ...UI erstellen muss. In den Beispielen die wir haben, ist das bisher nicht so gehandhabt worden. Vielleicht kamen wir bisher auch immer ohne aus...
 
Das was da steht deutet doch darauf hin, dass ihr ein Programm hattet, das mit static arbeitete und ihr deshalb kein Objekt erstellen musstet.
Da das aber nunmal nicht Sinn des Konzepts der Objekt-Orientierung ist und man dann genauso gut in C hätte weiterschreiben können, macht man es eben so wie du es jetzt oben stehen hast.

Was studierst oder machst du denn, dass dir die Unterschiede da nicht klar sind?
 
Ich studiere Wirtschaftsinformatik über die W3L im Onlinestudium, die Prüfungen sind Präsenztage an der FH Dortmund, der rest eben online.

Da ich aber Branchenfremd bin, ist dies alles etwas schwerer für mich wie für manch andere. Ich studiere nebenbei, bin eigentlich staatl. gepr. Vermessungstechniker und will die Branche wechseln.

Ich gehe mal davon aus, dass der Prof eine Standardfloskel benutzt hat um meinen "public"-Fehler zu kennzeichnen. Er hatte wohl keine Lust den Satz neu zu schreiben :P
 
Zurück
Oben