Interface实现了重写其自己的方法以将其自身创建为DEFAULT

问题描述 投票:1回答:2

我已经阅读了很多有关问题的主题,这些问题看起来像我要问的问题。但是,我找不到可以用于我的问题的令人满意的答案,因为我的问题有多个方面,分为三个方面。

这是https://github.com/google/ExoPlayer/blob/release-v2/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderFactory.java中的SubtitleDecoderFactory接口>

据我所知,接口是抽象的,不能有方法的具体实现(也许新的Java允许这样做,但由于我是Java的新手,所以请坚持使用Java的一般规则)。因此,对我来说有意义的是,接口中有两个抽象方法声明,分别是“布尔值supportsFormat(格式格式)”和“ SubtitleDecoder createDecoder(格式格式)”。但是我不明白,我的问题是:

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

  2. 此接口通过重写其自己的方法进行初始化,这是没有意义的动作吗? (接口是要有其他类来实现它,而不是本身,是吗?)

  3. 假设问题1和2有效,在接口中创建自身对象的好处是什么?

  4. 实现此接口的类的实例是否具有此intetface的DEFAULT实例?


  5. 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);
            }
          };
    }
    

我已经阅读了很多有关问题的主题,这些问题看起来像我要问的问题。但是,由于找不到多个...

java object interface overriding new-operator
2个回答
2
投票

new SubtitleDecoderFactory() { ... }创建实现接口anonymous inner classSubtitleDecoderFactory的实例。然后将此实例分配给静态字段DEFAULT(“ 接口主体中的每个字段声明都隐式publicstaticfinal


0
投票
  1. 为什么该接口可以实现“ SubtitleDecoderFactory DEFAULT = new SubtitleDecoderFactory()”,它看起来像是初始化方法的实现?
© www.soinside.com 2019 - 2024. All rights reserved.