Freitag, 8. März 2013

Warum ist StandardCharsets final?

In vielen Anwendungen und Bibliotheken findet man eine Klasse, die Konstanten für häufig benutzte Zeichensätze enthält:

import java.nio.charset.Charset;
 
public class ApplicationCharsets {
  public static final Charset UTF_8
    = Charset.forName( "UTF-8" );
  public static final Charset ISO_8859_1
    = Charset.forName( "ISO-8859-1" );
  public static final Charset WINDOWS_1252
    = Charset.forName( "WINDOWS-1252" );


Seit Java 7 gibt es die Klasse java.nio.charset.StandardCharsets, die Konstanten für die Zeichensätze enthält, die garantiert in jeder Java-Implementierung zur Verfügung stehen – US-ASCII, ISO-8859-1 (ISO Latin 1) sowie diverse Unicode-Kodierungen.

Damit man im Anwendungs-Code nicht verschiedene Klassen für die Standard- und die Anwendungs-Zeichensatzkodierungen referenzieren muss, könnte man die Anwendungs-Konstanten wie folgt formulieren ...

import java.nio.charset.*;
 
public class ApplicationCharsets
    extends StandardCharsets /* geht nicht :-( */ {
 
  public static final Charset WINDOWS_1252
    = Charset.forName( "WINDOWS-1252" );


... wenn die Klasse StandardCharsets nicht final wäre. So bleibt derzeit leider nur folgender Ausweg:

public class ApplicationCharsets {
  public static final Charset UTF_8
    = StandardCharsets.UTF_8;
  public static final Charset ISO_8859_1
    = StandardCharsets.ISO_8859_1;
  public static final Charset WINDOWS_1252
    = Charset.forName( "WINDOWS-1252" );


Warum also darf von StandardCharsets keine Unterklasse abgeleitet werden? Einfach nur aus historischen Gründen, weil ähnliche Klassen bisher auch final waren? Kann man das in Java 8 ändern?