当前位置: 首页 > 面试题库 >

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

韶云瀚
2023-03-14
问题内容

但是那我该如何解决呢?

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

(当然,您也可以使用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中,何时应使用静态非最终变量? 例如 显然,这里我们不是在谈论常量。 根据我的经验,我经常在使用单例时对它们进行辩护,但后来我最终需要拥有多个实例,这使我感到非常头痛和重构。 似乎很少在实践中使用它们。你怎么看? 问题答案: 统计信息收集可以使用非最终变量,例如,计算创建的实例数。另一方面,对于这种情况,您可能还是要使用etc,这时可能是最终的。另外,如果您要收集多个统计信息

  • 问题内容: 我了解由于歧义性问题,抽象类或接口都不能包含既抽象又静态的方法,但是有解决方法吗? 我想要一个抽象类或一个接口,该接口要求在扩展/实现该类/接口的所有类中都包含静态方法。有没有办法在Java中做到这一点?如果没有,这可能是我使用Java的最后一根稻草… 编辑1:此问题的上下文是我有一堆类,现在称它们为Stick,Ball和Toy,它们在数据库中有一堆条目。我想创建一个称为Fetchab

  • 我的spring integration应用程序需要能够通过简单的配置更改在Kafka和传统消息传递库(tibco rendezvous,spring integration不提供任何默认出站网关实现)之间按需切换<传统消息传递库提供了一些基本的请求/回复方法 我试图找出提取出站消息网关(Kafka和legacy)的最佳方法,以便在我的主IntegrationFlow中(通过简单的配置更改)交换其

  • 问题内容: 我有一个很简单的问题: 我想要一个Java类,该类提供一个公共静态方法,该方法可以执行某些操作。这只是出于封装目的(将所有重要的内容都放在一个单独的类中)… 此类不应被实例化或扩展。那让我写道: (尽管我知道,这是禁止的)。 我也知道,我可以使此类完全为final,并在将其私有化时覆盖标准构造函数。 但这在我看来更像是一种“解决方法”,应该更可能由最终的抽象类完成… 而且我讨厌解决方法

  • 问题内容: 我想知道 在go中处理多层抽象错误 的最佳方法是什么。每当我必须在程序中添加新的级别抽象时,都必须将错误代码从较低级别传输到较高级别。从而日志文件中有重复的通讯,或者我必须记住删除低级别的通讯形式并将其转移到更高级别。下面简单地举例。我跳过了创建每个对象的简短代码,但是我认为您理解我的问题 结果在日志文件中,我得到重复的帖子 反过来,如果我仅将某些部分转移到更高的级别而没有其他日志,那

  • 问题内容: 我有六个类,它们都扩展了相同的抽象类。抽象类具有一个静态变量,该静态变量指向一些JNI代码,我只希望在每个类实例化时加载一次。 据我了解,这将导致实例化此静态变量的一个实例,但是我想要的是每个扩展类都具有自己的变量静态实例,该实例对于给定的子类是唯一的。我想在我的抽象类中编写一些代码来修改和/或释放该抽象类。是否可以同时执行这两项操作? 例如,我可以编写一个抽象类栏,其中包含变量foo