Java:静态抽象(再次) – 最佳实践如何解决

理论上我理解了Java中没有抽象静态的观点,例如在Why can’t static methods be abstract in Java中解释。

但是如何解决这样的问题呢?

我的应用程序使用几种类型的文件,我想要分配静态属性,如该文件类型的描述(如“数据文件”,另一个是“配置文件”等)。
显然,我将它放入一个静态字符串,以便描述可以访问,而不需要实例化一个文件(对GUI f.i有用)。
另一方面,显然所有文件类型都应该有一些常见的方法,比如getStatus(),这显然我想要继承一个常用的超类MyFileType。

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

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

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);

(当然,您也可以使用TypeInfo中的getter来封装底层字符串。)

然而,正如你所说,我们真正想要的是在编译时强制在所有的每个文件类型的类中存在特定的签名静态方法,但是’明显的’设计路径导致需要一个抽象的静态方法不允许的公共超类。

我们可以在运行时执行此操作,但这可能足以确保编码正确。我们介绍一个文件超类:

package myFileAPI;

public abstract class File {

    public static TypeInfo getTypeInfo() {
        throw new IllegalStateException(
                    "Type info hasn't been set up in the subclass");
    }

}

如果TextFile现在扩展File,我们将在运行时调用TextFile.getTypeInfo()时获取此异常,除非TextFile具有相同的签名方法。

这是非常微妙的:即使在TextFile中没有这样的方法,仍然编译的TextFile.getTypeInfo()的代码。即使在编译时绑定静态方法,编译器仍然可以通过类层次结构来确定编译时静态调用目标。

所以我们需要代码如下:

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

http://stackoverflow.com/questions/4730036/java-static-abstract-again-best-practice-how-to-work-around

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java:静态抽象(再次) – 最佳实践如何解决