您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java:静态抽象(再次)-最佳实践

Java:静态抽象(再次)-最佳实践

重述该问题:您希望每个文件类型的类具有有关该类型的静态可用信息(例如,名称和描述)。

我们可以轻松地解决问题:为您的类型信息创建一个单独的类,并在每个每个文件类型类中都有一个静态实例(适当实例化)。

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 extends File,则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()仍然可以“无意义地”调用

java 2022/1/1 18:28:46 有446人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶