Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 10 Die Klassenbibliothek
Pfeil 10.1 Die Java-Klassenphilosophie
Pfeil 10.1.1 Übersicht über die Pakete der Standardbibliothek
Pfeil 10.2 Object ist die Mutter aller Klassen
Pfeil 10.2.1 Klassenobjekte
Pfeil 10.2.2 Objektidentifikation mit toString()
Pfeil 10.2.3 Objektgleichheit mit equals() und Identität
Pfeil 10.2.4 Klonen eines Objekts mit clone()
Pfeil 10.2.5 Hashcodes über hashCode() liefern
Pfeil 10.2.6 Aufräumen mit finalize()
Pfeil 10.2.7 Synchronisation
Pfeil 10.3 Die Spezial-Oberklasse Enum
Pfeil 10.3.1 Methoden auf Enum-Objekten
Pfeil 10.3.2 enum mit eigenen Konstruktoren und Methoden
Pfeil 10.4 Klassenlader (Class Loader)
Pfeil 10.4.1 Woher die kleinen Klassen kommen
Pfeil 10.4.2 Setzen des Klassenpfades
Pfeil 10.4.3 Die wichtigsten drei Typen von Klassenladern
Pfeil 10.4.4 Der java.lang.ClassLoader
Pfeil 10.4.5 Hot Deployment mit dem URL-Classloader
Pfeil 10.4.6 Das jre/lib/endorsed-Verzeichnis
Pfeil 10.5 Die Utility-Klasse System und Properties
Pfeil 10.5.1 Systemeigenschaften der Java-Umgebung
Pfeil 10.5.2 line.separator
Pfeil 10.5.3 Property von der Konsole aus setzen
Pfeil 10.5.4 Umgebungsvariablen des Betriebssystems
Pfeil 10.5.5 Einfache Zeitmessung und Profiling
Pfeil 10.6 Ausführen externer Programme und Skripte
Pfeil 10.6.1 ProcessBuilder und Prozesskontrolle mit Process
Pfeil 10.6.2 Einen Browser/E-Mail-Client/Editor aufrufen
Pfeil 10.6.3 Ausführen von Skripten
Pfeil 10.7 Benutzereinstellungen
Pfeil 10.7.1 Benutzereinstellungen speichern
Pfeil 10.7.2 Einträge einfügen, auslesen und löschen
Pfeil 10.7.3 Auslesen der Daten und Schreiben in anderem Format
Pfeil 10.7.4 Auf Ereignisse horchen
Pfeil 10.7.5 Zugriff auf die gesamte Windows-Registry
Pfeil 10.8 Musik abspielen
Pfeil 10.8.1 Die Arbeit mit AudioClip
Pfeil 10.8.2 Java Sound API
Pfeil 10.9 Annotationen
Pfeil 10.9.1 Annotationstypen @Override, @Deprecated, @SuppressWarnings
Pfeil 10.9.2 Annotationen für Web-Services
Pfeil 10.10 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

10.3 Die Spezial-Oberklasse Enum Zur nächsten ÜberschriftZur vorigen Überschrift

Jedes Aufzählungsobjekt erbt von der Spezialklasse Enum. Nehmen wir erneut die Wochentage:

Listing 10.12 com/tutego/insel/enumeration/Weekday.java, Weekday

public enum Weekday 
{ 
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 
}

Der Compiler übersetzt dies in eine Klasse, die etwa so aussieht:

class Weekday extends Enum 
{ 
  public static final Weekday MONDAY  = new Weekday( "MONDAY",   0 ); 
  public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 ); 
  ... 
 
  private Weekday( String s, int i ) 
  { 
    super( s, i ); 
  }

Galileo Computing - Zum Seitenanfang

10.3.1 Methoden auf Enum-Objekten Zur nächsten ÜberschriftZur vorigen Überschrift

Jedes Enum-Objekt besitzt automatisch einige Standardfunktionen, die von der Oberklasse java.lang.Enum kommen. Das sind zum einen überschriebene Methoden aus java.lang.Object, einige neue Objektfunktionen und einige statische Funktionen.

Alle Konstanten der Klasse aufzählen

Eine praktische statische Funktion ist values(). Sie liefert ein Feld von Enum-Objekten. Nützlich ist das für das erweiterte for, das alle Konstanten aufzählen soll. Eine Alternative mit dem gleichen Ergebnis ist die Class-Methode getEnumConstants().

Listing 10.13 com/tutego/insel/enumeration/WeekdayDemo.java, Ausschnitt main()

for ( Weekday day : Weekday.values() )  // oder Weekday.class.getEnumConstants() 
  System.out.println( "Name=" + day.name() );

Liefert Zeilen mit Name=MONDAY, …

Auch toString() ist so implementiert, dass es den Namen liefert. Das Ergebnis ist also mit name() identisch:

System.out.println( Weekday.FRIDAY );                 // FRIDAY

Ordinalzahl

Von der Oberklasse Enum erbt jede Aufzählung einen geschützten parametrisierten Konstruktor, der den Namen der Konstanten sowie einen assoziierten Zähler erwartet. So wird aus jedem Element der Aufzählung ein Objekt vom Basistyp Enum, das einen Namen und eine ID, die so genannte Ordinalzahl, speichert. Natürlich kann es auch nach seinem Namen und Zähler gefragt werden.


Beispiel Eine Funktion, die die Ordinalzahl eines Elements der Aufzählung gibt oder –1, wenn die Konstante nicht existiert:

Listing 10.14 com/tutego/insel/enumeration/WeekdayDemo.java, getOrdinal()

static int getOrdinal( String name ) 
{ 
  try { 
    return Weekday.valueOf( name ).ordinal(); 
  } 
  catch ( IllegalArgumentException e ) { 
    return –1; 
  } 
}

Damit liefert getOrdinal("MONDAY") == 0 und getOrdinal("FEIERTAG") == –1.



abstract class Enum<E extends Enum<E>> 
implements Comparable<E>, Serializable

  • final int ordinal()
    Liefert die zur Konstante gehörige ID. Im Allgemeinen ist diese Ordinalzahl nicht wichtig, aber besondere Datenstrukturen wie EnumSet oder EnumMap nutzen diese eindeutige ID. Die Reihenfolge der Zahlen ist durch die Reihenfolge der Angabe gegeben.
  • final String name()
    Liefert den Namen der Konstanten. Da die Methode – wie viele andere der Klasse – final ist, lässt sich der Name nicht ändern.
  • public final boolean equals( Object other )
    Die Oberklasse Enum überschreibt equals() mit der Logik wie in Object – also den Vergleich der Referenzen –, um sie als final zu markieren.
  • protected final Object clone() throws CloneNotSupportedException
    Die Methode clone() ist final protected und kann also weder überschrieben noch von außen aufgerufen werden. So kann es keine Kopien der Enum-Objekte geben, die die Identität gefährden könnten. (Grundsätzlich ist es aber erlaubt, wenn eigene Implementierungen von clone() die this-Referenz liefern.)
  • String toString()
    Liefert den Namen der Konstanten. Die Methode ruft standardisiert name() auf, weil sie aber nicht final ist, kann sie überschrieben werden.
  • final int compareTo( E o )
    Da die Enum-Klasse die Schnittstelle Comparable implementiert, gibt es auch die Methode compareTo(). Sie vergleicht anhand der Ordinalzahlen. Vergleiche sind nur innerhalb eines Enum-Typs erlaubt.
  • static <T extends Enum<T>> T valueOf( Class<T> enumType, String s )
    Ermöglicht das Suchen von Enum-Objekten zu einem Konstantennamen und einer Enum-Klasse. Sie liefert das Enum-Objekt für die gegebene Zeichenfolge oder löst eine IllegalArgumentException aus, wenn dem String kein Enum-Objekt zuzuordnen ist.
  • final Class<E> getDeclaringClass()
    Liefert das Class-Objekt zu einem konkreten Enum.

Hinweis Die Methode getDeclaringClass() liefert auf der Aufzählungsklasse selbst null und nur auf den Elementen der Aufzählung einen sinnvollen Wert:

System.out.println( Weekday.class.getDeclaringClass() );  // null 
System.out.println( Weekday.MONDAY.getDeclaringClass() ); // class com.tutego. 
                                                          // weekday.Weekday


Galileo Computing - Zum Seitenanfang

10.3.2 enum mit eigenen Konstruktoren und Methoden topZur vorigen Überschrift

Da eine enum-Klasse mit der Klassendeklaration verwandt ist, kann sie ebenso Attribute und Methoden deklarieren. Geben wir einer Aufzählung Country eine Methode, die den ISO-3166-2-Landescode des jeweiligen Aufzählungselements liefert:

Listing 10.15 com/tutego/insel/enumeration/Country.java, Country

public enum Country 
{ 
  GERMANY, UK, CHINA; 
 
  public String getISO3Country() 
  { 
    if ( this == GERMANY ) 
      return Locale.GERMANY.getISO3Country(); 
    else if ( this == UK ) 
      return Locale.UK.getISO3Country(); 
    return Locale.CHINA.getISO3Country(); 
  } 
}

Die Methode getISO3Country() kann nun auf den Enum-Objekten aufgerufen werden.

System.out.println( Country.CHINA.getISO3Country() ); // CHN

Da switch auf enum erlaubt ist, können wir schreiben:

Listing 10.16 CountryEnumDemo.java, Ausschnitt

Country c = Country.GERMANY; 
 
switch ( c ) 
{ 
  case GERMANY: 
    System.out.println( "Aha. Ein Krauti" );         // Aha. Ein Krauti 
    System.out.println( meinLand.getISO3Country() ); // DEU 
    break; 
  default:      System.out.println( "Anderes Land" ); 
}

Enum mit Konstruktoren

Neben dieser Variante wollen wir eine zweite Implementierung nutzen und nun Konstruktoren hinzuziehen, um das gleiche Problem auf andere Weise zu lösen:

Listing 10.17 com/tutego/insel/enumeration/Country.java, Country

public enum Country 
{ 
  GERMANY( Locale.GERMANY ), UK( Locale.UK ), CHINA( Locale.CHINA ); 
 
  private Locale country; 
 
  private Country( Locale country ) 
  { 
    this.country = country; 
  } 
 
  public String getISO3Country() 
  { 
    return country.getISO3Country(); 
  } 
}

Bei der Deklaration der Konstanten wird in runden Klammern ein Argument für den Konstruktor übergeben. Der Konstruktor speichert das zugehörige Locale-Objekt in der internen Variablen country, auf die dann getISO3Country() Bezug nimmt.

Enum mit überschriebenen Methoden

In dem Enum-Typ lassen sich nicht nur Methoden hinzufügen, sondern auch Methoden überschreiben. Beginnen wir mit einer lokalisierten und überladenen Methode toString().

Listing 10.18 com/tutego/insel/enumeration/WeekdayInternational.java, WeekdayInternational

public enum WeekdayInternational 
{ 
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; 
 
  @Override 
  public String toString() 
  { 
    return new SimpleDateFormat().getDateFormatSymbols().getWeekdays()Zeilen-Umbruch 
                 [ ordinal() + 1 ]; 
  } 
 
  public String toString( Locale l ) 
  { 
    return new SimpleDateFormat("", l).getDateFormatSymbols().getWeekdays()Zeilen-Umbruch 
                 [ ordinal() + 1 ]; 
  } 
}

Die erste Methode ist aus unserer Oberklasse Object überschrieben, die zweite als überladene Funktion hinzugefügt. Ein Beispiel macht den Aufruf und die Funktionsweise klar:

Listing 10.19 com/tutego/insel/enumeration/WeekdayInternationalDemo.java, main()

System.out.println( WeekdayInternational.SATURDAY );                         // Samstag 
System.out.println( WeekdayInternational.SATURDAY.toString() );              // Samstag 
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.FRANCE) ); // samedi 
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.ITALY) );  // sabato

An dieser Stelle hören die Möglichkeiten der Enum-Syntax aber noch nicht auf. Ähnlich wie die Syntax von inneren anonymen Klassen, die es erlauben, Methoden zu überschreiben, bieten Aufzählungstypen eine vergleichbare Syntax, um gezielt Methoden für eine spezielle Konstante zu überschreiben.

Nehmen wir an, in einem Spiel gibt es eine eigene Währung, den Ponro Dollar. Nun soll dieser aber mit einer Referenzwährung, dem Euro, in Beziehung gesetzt werden; der Wechselkurs ist einfach 1:2.

Listing 10.20 com/tutego/insel/enumeration/GameCurrency.java, GameCurrency

public enum GameCurrency 
{ 
  EURO() { 
    @Override double convertTo( GameCurrency targetCurrency, double value ) 
    { 
      return targetCurrency == EURO ? value : value / 2; 
    } 
  }, 
  PONRODOLLAR() { 
    @Override double convertTo( GameCurrency targetCurrency, double value ) 
    { 
      return targetCurrency == PONRODOLLAR ? value : value * 2; 
    } 
  }; 
 
  abstract double convertTo( GameCurrency targetCurrency, double value ); 
}

Der interessante Teil ist die Deklaration der abstrakten convertTo()-Methode und die Implementierung lokal bei den einzelnen Konstanten. (Natürlich müssen wir nicht jede Methoden im Enum abstrakt machen, sondern sie kann auch konkret sein. Dann muss nicht jedes Enum-Element die abstrakte Methode implementieren.)

Mit einem statischen Import für die Aufzählung lässt sich die Nutzung und Funktionalität schnell zeigen:

Listing 10.21 com/tutego/insel/enumeration/GameCurrencyDemo.java, main()

System.out.println( EURO.convertTo( EURO, 12 ) );               // 12.0 
System.out.println( EURO.convertTo( PONRODOLLAR, 12 ) );        // 6.0 
System.out.println( PONRODOLLAR.convertTo( EURO, 12 ) );        // 24.0 
System.out.println( PONRODOLLAR.convertTo( PONRODOLLAR, 12 ) ); // 12.0


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de