Java 接口实现重写自己的方法以创建自身的对象作为默认对象

Java 接口实现重写自己的方法以创建自身的对象作为默认对象,java,object,interface,overriding,new-operator,Java,Object,Interface,Overriding,New Operator,我已经读了很多关于问题的文章,这些问题看起来像我要问的问题。然而,我找不到满意的答案来回答我的问题,因为我的问题不止一个方面,分为三个方面 这是中的DecoderFactory接口 据我所知,交互是抽象的,不能有方法的具体实现(也许新java允许这样做,但由于我对java不熟悉,让我们坚持java的一般规则)。因此,对我来说,接口中有两个abstract-mothod声明是有意义的,它们是“boolean-supportsFormat(Format-Format)”和“SubtitleDecod

我已经读了很多关于问题的文章,这些问题看起来像我要问的问题。然而,我找不到满意的答案来回答我的问题,因为我的问题不止一个方面,分为三个方面

这是中的DecoderFactory接口

据我所知,交互是抽象的,不能有方法的具体实现(也许新java允许这样做,但由于我对java不熟悉,让我们坚持java的一般规则)。因此,对我来说,接口中有两个abstract-mothod声明是有意义的,它们是“boolean-supportsFormat(Format-Format)”和“SubtitleDecoder-createDecoder(Format-Format)”。但我不明白的是,我的问题是:

  • 为什么这个接口可以实现“SubtitleDecoderFactory DEFAULT=new SubtitleDecoderFactory()”,它看起来像是初始化方法的实现

  • 这个接口通过重写自己的方法来初始化自己,这是一个没有意义的操作吗?(一个接口应该有其他类来实现它,而不是它本身,对吗?)

  • 假设问题1和2有效,在接口中创建对象本身有什么好处

  • 实现此接口的类的实例是否具有此intetface的默认实例



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