Java 接口实现重写自己的方法以创建自身的对象作为默认对象
我已经读了很多关于问题的文章,这些问题看起来像我要问的问题。然而,我找不到满意的答案来回答我的问题,因为我的问题不止一个方面,分为三个方面 这是中的DecoderFactory接口 据我所知,交互是抽象的,不能有方法的具体实现(也许新java允许这样做,但由于我对java不熟悉,让我们坚持java的一般规则)。因此,对我来说,接口中有两个abstract-mothod声明是有意义的,它们是“boolean-supportsFormat(Format-Format)”和“SubtitleDecoder-createDecoder(Format-Format)”。但我不明白的是,我的问题是:Java 接口实现重写自己的方法以创建自身的对象作为默认对象,java,object,interface,overriding,new-operator,Java,Object,Interface,Overriding,New Operator,我已经读了很多关于问题的文章,这些问题看起来像我要问的问题。然而,我找不到满意的答案来回答我的问题,因为我的问题不止一个方面,分为三个方面 这是中的DecoderFactory接口 据我所知,交互是抽象的,不能有方法的具体实现(也许新java允许这样做,但由于我对java不熟悉,让我们坚持java的一般规则)。因此,对我来说,接口中有两个abstract-mothod声明是有意义的,它们是“boolean-supportsFormat(Format-Format)”和“SubtitleDecod
newsubtitledecoderfactory(){…}
创建实现接口SubtitleDecoderFactory
的实例。然后将此实例分配给静态字段DEFAULT
(“接口主体中的每个字段声明都隐式地public
,静态
,和最终
”)
在程序的其余部分中,匿名类的实例可以通过
SubtitleDecoderFactory访问。默认值新建SubtitleDecoderFactory(){…}
创建实现接口SubtitleDecoderFactory
的实例。然后将此实例分配给静态字段DEFAULT
(“接口主体中的每个字段声明都隐式地public
,静态
,和最终
”)
在程序的其余部分,匿名类的实例可以通过SubtitleDecoderFactory.DEFAULT
访问
为什么这个接口可以实现“SubtitleDecoderFactory DEFAULT=new SubtitleDecoderFactory()”,它看起来像是初始化方法的实现
接口没有实现任何东西。您拥有的是一个名为DEFAULT
的public
,static
,final
字段,该字段分配了SubtitleDecoderFactory
的实例
这个接口通过重写自己的方法来初始化自己,这是一个没有意义的操作吗?(一个接口应该有其他类来实现它,而不是它本身,对吗?)
同样,接口既没有“初始化自身”,也没有实现自身。您拥有的是一个匿名类的示例。正是这个匿名类实现了SubtitleDecoderFactory
。匿名类被实例化,实例被分配到DEFAULT
字段;当类
初始化时会发生这种情况
假设问题1和2有效,在接口中创建对象本身有什么好处
在这种情况下,将提供SubtitleDecoderFactory
的默认实现。这个默认实现只有一个实例,因为接口中声明的所有字段都是隐式公共的、静态的和最终的;这是一个单身的例子
这里一个可能的优势是您不必声明另一个命名类。由于目标显然是要有一个单例,因此也不需要命名类
实现此接口的类的实例是否具有此intetface[sic]的默认实例
请记住,DEFAULT
是一个引用匿名类实例的字段。SubtitleDecoderFactory
的所有实现是否都可以访问此字段?是的,但不是特别的,因为他们正在实现接口
由于接口中声明的所有字段都是公共的、静态的和最终的,DEFAULT
字段是一个常量(尽管不是编译时常量)。静态字段与类关联,而不是与该类的实例关联。换句话说,任何可以“查看”SubtitleDecoderFactory
的类都可以访问DEFAULT
字段。例如:
/*根据需要导入SubtitleDecoderFactory接口*/
公共班机{
公共静态void main(字符串[]args){
System.out.println(SubtitleDecoderFactory.DEFAULT==SubtitleDecoderFactory.DEFAULT);
}
}
为什么这个接口可以实现“SubtitleDecoderFactory DEFAULT=new SubtitleDecoderFactory()”,它看起来像是初始化方法的实现
接口没有实现任何东西。您拥有的是一个名为DEFAULT
的public
,static
,final
字段,该字段分配了SubtitleDecoderFactory
的实例
这个接口通过重写自己的方法来初始化自己,这是一个没有意义的操作吗?(一个接口应该有其他类来实现它,而不是它本身,对吗?)
同样,接口既没有“初始化自身”,也没有实现自身。您拥有的是一个匿名类的示例。正是这个匿名类实现了SubtitleDecoderFactory
。将实例化匿名类,并将实例分配给
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);
}
};
}