Javaschubla.de - Java als erste Programmiersprache

OO08 Private Methoden

Nicht nur Attribute, auch Methoden können private sein.

So sieht die Klasse Angestellter bis jetzt aus (ohne die equals-Methode, um die es hier nicht geht):

class Angestellter
{
  private String vorname;
  private String nachname;
  private int alter;
  private int gehalt;

  Angestellter(String v, String n, int a, int g)
  {
    vorname = v;
    nachname = n;
    alter = a;
    gehalt = g;
  }

  String getVorname()
  {
    return vorname;
  }

  String getNachname()
  {
    return nachname;
  }

  int getAlter()
  {
    return alter;
  }

  int getGehalt()
  {
    return gehalt;
  }

  void setGehalt(int neuesGehalt)
  {
    if (neuesGehalt < gehalt)
    {
      System.err.println("Das ist aber keine Erhöhung!");
    }
    else
    {
      gehalt = neuesGehalt;
    }
  }

  void erhöheGehalt(int erhöhung)
  {
    if (erhöhung <= 0)
    {
      System.err.println("Das ist aber keine Erhöhung!");
    }
    else
    {
      gehalt += erhöhung;
    }
  }

  void geburtstagFeiern()
  {
    alter++;
    System.out.println("Happy birthday " + vorname + " " + nachname + "!");
  }
}

Diese Methoden sind kurz und übersichtlich, aber in einem echten Programm gäbe es sicher sehr lange Methoden. Diese sollte man dann in mehrere Methoden aufteilen. Man geht in imparativen Sprachen wie Java zwar nicht so weit wie oft in funktionalen Sprachen wie Scheme - jede Methode in Dutzende Methoden zu ein bis drei Zeilen aufzuteilen wäre sehr unüblich. Aber eine Methode sollte möglichst auf einen Bildschirm passen und es sollte in Bedingungen und Schleifen nicht zu tief geschachtelt werden (möglichst nicht mehr als drei oder vier Schachtelungen, manche Leute sagen sogar nicht mehr als ein oder zwei).

Aber wenn wir eine Methode in mehrere zerlegen bzw. einige Teile in Hilfsmethoden auslagern, hat unsere Klasse plötzlich wahnsinnig viele Methoden. Der Benutzer der Klasse, also der Programmierer der Klasse AngestelltenVerwaltung, wüsste gar nicht mehr, welche Methoden er benutzen soll - die Hilfsmethoden ja nicht, die tun für ihn nichts Sinnvolles.

Die Lösung ist ganz einfach: Die Hilfsmethoden, die die Klasse nur für sich selbst braucht, werden private gemacht. Genau so wie auf die privaten Attribute können andere Klassen auch nicht auf die privaten Methoden zugreifen.

Im folgenden Beispiel wird eine private Methode hinzugefügt, die dafür sorgt, dass der Anfangsbuchstabe des Vor- und des Nachnamens groß, der Rest klein ist.

class Angestellter
{
  private String vorname;
  private String nachname;
  private int alter;
  private int gehalt;

  Angestellter(String v, String n, int a, int g)
  {
    vorname = großKleinSchreibung(v);
    nachname = großKleinSchreibung(n);
    alter = a;
    gehalt = g;
  }

  private String großKleinSchreibung(String name)
  {
    return Character.toUpperCase(name.charAt(0)) + name.substring(1).toLowerCase();
  }

  String getVorname()
  {
    return vorname;
  }

  String getNachname()
  {
    return nachname;
  }

  int getAlter()
  {
    return alter;
  }

  int getGehalt()
  {
    return gehalt;
  }

  void setGehalt(int neuesGehalt)
  {
    if (neuesGehalt < gehalt)
    {
      System.err.println("Das ist aber keine Erhöhung!");
    }
    else
    {
      gehalt = neuesGehalt;
    }
  }

  void erhöheGehalt(int erhöhung)
  {
    if (erhöhung <= 0)
    {
      System.err.println("Das ist aber keine Erhöhung!");
    }
    else
    {
      gehalt += erhöhung;
    }
  }

  void geburtstagFeiern()
  {
    alter++;
    System.out.println("Happy birthday " + vorname + " " + nachname + "!");
  }
}

Die Methode können wir auch zusätzlich static machen, denn sie benötigt keinen Zugriff auf die Attribute. Alles, was sie wissen muss, bekommt sie als Parameter übergeben, was sie berechnet, gibt sie zurück und verändert keine Attribute oder anderen nicht-lokalen Variablen.


Übung

Schreibe - für den Fall, dass ein Angestellter heiratet - eine nicht-private Methode setNachname.


In der nächsten Lektion geht es wieder einmal um Strings.