java - 接口实现了覆盖自己的方法来创建自己的对象作为默认值
问题描述
我已经阅读了许多带有问题的主题,这些问题看起来像是我要问的问题。但是,我找不到可以应用于我的问题的令人满意的答案,因为我的问题不止一个,分为三个方面。
据我了解,交互是抽象的,不能有具体的方法实现(也许新的java允许这样做,但由于我是java新手,让我们坚持Java的一般规则)。所以对我来说,接口中有两个抽象方法声明是有意义的,它们是“boolean supportsFormat(Format format)”和“SubtitleDecoder createDecoder(Format format)”。但我不明白,我的问题是:
为什么这个接口可以实现“SubtitleDecoderFactory DEFAULT = new SubtitleDecoderFactory()”,看起来像是初始化方法的实现?
这个接口通过重写自己的方法来初始化自己,是不是一个无意义的动作?(一个接口意味着有其他类来实现它,而不是它本身,对吗?)
假设问题 1 和 2 有效,在接口中创建自身对象有什么好处?
实现此接口的类的实例是否将具有此接口的 DEFAULT 实例?
public interface SubtitleDecoderFactory {
boolean supportsFormat(Format format);
SubtitleDecoder createDecoder(Format format);
SubtitleDecoderFactory DEFAULT =
new SubtitleDecoderFactory() {
@Override
public boolean supportsFormat(Format format) {
@Nullable String mimeType = format.sampleMimeType;
return MimeTypes.TEXT_VTT.equals(mimeType)
|| MimeTypes.TEXT_SSA.equals(mimeType)
|| MimeTypes.APPLICATION_TTML.equals(mimeType)
|| MimeTypes.APPLICATION_MP4VTT.equals(mimeType)
|| MimeTypes.APPLICATION_SUBRIP.equals(mimeType)
|| MimeTypes.APPLICATION_TX3G.equals(mimeType)
|| MimeTypes.APPLICATION_CEA608.equals(mimeType)
|| MimeTypes.APPLICATION_MP4CEA608.equals(mimeType)
|| MimeTypes.APPLICATION_CEA708.equals(mimeType)
|| MimeTypes.APPLICATION_DVBSUBS.equals(mimeType)
|| MimeTypes.APPLICATION_PGS.equals(mimeType);
}
@Override
public SubtitleDecoder createDecoder(Format format) {
@Nullable String mimeType = format.sampleMimeType;
if (mimeType != null) {
switch (mimeType) {
case MimeTypes.TEXT_VTT:
return new WebvttDecoder();
case MimeTypes.TEXT_SSA:
return new SsaDecoder(format.initializationData);
case MimeTypes.APPLICATION_MP4VTT:
return new Mp4WebvttDecoder();
case MimeTypes.APPLICATION_TTML:
return new TtmlDecoder();
case MimeTypes.APPLICATION_SUBRIP:
return new SubripDecoder();
case MimeTypes.APPLICATION_TX3G:
return new Tx3gDecoder(format.initializationData);
case MimeTypes.APPLICATION_CEA608:
case MimeTypes.APPLICATION_MP4CEA608:
return new Cea608Decoder(mimeType, format.accessibilityChannel);
case MimeTypes.APPLICATION_CEA708:
return new Cea708Decoder(format.accessibilityChannel, format.initializationData);
case MimeTypes.APPLICATION_DVBSUBS:
return new DvbDecoder(format.initializationData);
case MimeTypes.APPLICATION_PGS:
return new PgsDecoder();
default:
break;
}
}
throw new IllegalArgumentException(
"Attempted to create decoder for unsupported MIME type: " + mimeType);
}
};
}
解决方案
推荐阅读
- python - 用python列出文件名的问题
- r - dplyr 中的“summarise_all”和计算/输出顺序的描述性统计
- php - DomCrawler 在特定元素之后获取元素内容
- python - 将 pandas 数据框转换为以列为键的 json
- python - 如何隔离已添加 n 次的列表元素?
- javascript - 点击下载按钮从网址下载图片:网址中的点都被下划线代替了?
- javascript - 回调、承诺或等待 API 请求
- c# - MimeKit 附件正文编码问题
- delphi - 显示模态时调用覆盖的 ShowModal 时出错
- android - 如何在浮动操作模式下在 Android 9 上显示菜单项图标