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

发布于 2021-01-29 19:51:25

但是那我该如何解决呢?

我的应用程序使用几种类型的文件,我想分配一些静态属性,例如对该文件类型的描述(例如“数据文件”,另一个是“配置文件”,等等)。显然,我会将其放入静态String中,以便无需实例文件即可访问描述(对GUI
fi有用)。另一方面,显然所有文件类型都应具有一些通用方法,例如getStatus(),显然我想从通用超类继承MyFileType

getDescription() 在超类中当然是抽象的。

尝试使用超类和接口的组合,但是存在类似的问题:不允许抽象方法的静态实现。

Java专家将如何解决这个问题?我真的想创建一个如此糟糕的实现吗?

非常感谢,菲利普

关注者
0
被浏览
78
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

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



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看