栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

如果为

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号