重述该问题:您希望每个文件类型的类具有有关该类型的静态可用信息(例如,名称和描述)。
我们可以轻松地解决问题:为您的类型信息创建一个单独的类,并在每个每个文件类型类中都有一个静态实例(适当实例化)。
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; }}然后说:
package myFileAPI;public class TextFile { public static final TypeInfo typeInfo = new TypeInfo("Text", "Contains text.");}然后,您可以执行以下操作:
System.out.println(TextFile.typeInfo.name);
(当然,您也可以使用getter
TypeInfo封装底层字符串。)
但是,正如您所说,我们真正想要的是 在编译时 在所有每个文件类型的类 中 强制执行
特定签名静态方法的存在,但是“显而易见”的设计路径导致要求在一个静态静态方法中使用抽象静态方法。不允许的普通超类。 __
不过,我们 可以 在运行时 强制执行此操作,这可能足以确保正确编码。我们介绍一个File超类:
package myFileAPI;public abstract class File { public static TypeInfo getTypeInfo() { throw new IllegalStateException( "Type info hasn't been set up in the subclass"); }}如果为
TextFilenow
extendsFile,则
TextFile.getTypeInfo()在运行时调用时将获得此异常,除非TextFile具有相同签名的方法。
这是相当微妙的
:
TextFile.getTypeInfo()即使TextFile中没有这样的方法,带有in的代码仍然可以编译。即使在编译时绑定了静态方法,编译
器仍然可以通过类层次结构来确定编译时的静态调用target 。
因此,我们需要如下代码:
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; }}请注意,我们仍在 遮盖 超类方法,因此
File.getTypeInfo()仍然可以“无意义地”调用。



