gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:27:21 26 4
gpt4 key购买 nike

我从理论上理解为什么 Java 中没有 abstract static,正如 Why can't static methods be abstract in Java 中所解释的那样。 .

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

我的应用程序使用了几种类型的文件,我想分配静态属性,例如对该文件类型的描述(例如“数据文件”,另一个是“配置文件”等)。显然,我会将其放入静态字符串中,以便无需实例化文件即可访问描述(对 GUI f.i. 很有用)。另一方面,显然所有文件类型都应该有一些常见的方法,如 getStatus(),显然我想从一个公共(public)父类(super class) MyFileType 继承。

getDescription() 在父类(super class)中当然是抽象的。

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

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来封装底层字符串。)

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

我们可以在运行时强制执行这个,这可能足以确保它被正确编码。我们引入一个 File 父类(super class):

package myFileAPI;

public abstract class File {

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

}

如果 TextFile 现在 extends File,我们会在运行时调用 TextFile.getTypeInfo() 时得到这个异常,除非 TextFile 有相同的-签名方法。

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

所以,我们需要这样的代码:

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

}

请注意,我们仍然在遮蔽父类(super class)方法,因此 File.getTypeInfo() 仍然可以“毫无意义地”调用。

关于Java:静态抽象(再次) - 如何解决的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com