Um das Problem noch einmal zu verdeutlichen: Sie möchten, dass Ihre Klassen pro Dateityp statisch verfügbare Informationen über den Typ haben (z. B. Name und Beschreibung).
Wir können leicht einen Teil des Weges dorthin gehen: Erstellen Sie eine separate Klasse für Ihre Typinformationen und haben Sie eine statische Instanz davon (entsprechend instanziiert) in jeder Klasse pro Dateityp.
package myFileAPI;
public class TypeInfo {
public final String name;
public final String description;
public TypeInfo(String name, String description) {
this.name = name;
this.description = description;
}
}
und, sagen wir:
package myFileAPI;
public class TextFile {
public static final TypeInfo typeInfo
= new TypeInfo("Text", "Contains text.");
}
Dann können Sie Dinge tun wie:
System.out.println(TextFile.typeInfo.name);
(Natürlich können Sie auch Getter in TypeInfo
um die zugrunde liegenden Zeichenketten zu kapseln).
Aber wie Sie schon sagten, wollen wir eigentlich nur durchsetzen. das Vorhandensein einer bestimmten statischen Methode mit Signatur in allen Ihren dateitypischen Klassen zur Kompilierzeit aber der "offensichtliche" Entwurfspfad führt dazu, dass eine abstrakte statische Methode in einer gemeinsamen Oberklasse erforderlich ist, was nicht zulässig ist.
Wir puede dies durchsetzen während der Laufzeit was jedoch ausreichen kann, um sicherzustellen, dass sie korrekt kodiert ist. Wir führen eine Oberklasse File ein:
package myFileAPI;
public abstract class File {
public static TypeInfo getTypeInfo() {
throw new IllegalStateException(
"Type info hasn't been set up in the subclass");
}
}
Wenn TextFile
jetzt extends File
erhalten wir diese Ausnahme beim Aufruf von TextFile.getTypeInfo()
zur Laufzeit, es sei denn, TextFile hat eine Methode mit gleicher Unterschrift.
Dies ist ziemlich subtil Code mit TextFile.getTypeInfo()
in kompiliert immer noch, auch wenn es keine solche Methode in TextFile gibt. Auch wenn statische Methoden zur Kompilierzeit gebunden werden, kann der Compiler immer noch die Klassenhierarchie durchsuchen, um das Ziel für den statischen Aufruf zur Kompilierungszeit zu bestimmen .
Wir brauchen also einen Code wie:
package myFileAPI;
public class TextFile extends File {
private static final TypeInfo typeInfo
= new TypeInfo("Text", "Contains text.");
// Shadow the superclass static method
public static TypeInfo getTypeInfo() {
return typeInfo;
}
}
Beachten Sie, dass wir immer noch Beschattung die Superklassen-Methode, und damit File.getTypeInfo()
kann immer noch "sinnlos" genannt werden.