首页 > 解决方案 > 接口实现了覆盖自己的方法来创建自己的对象作为默认值

问题描述

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

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

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

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

  2. 这个接口通过重写自己的方法来初始化自己,是不是一个无意义的动作?(一个接口意味着有其他类来实现它,而不是它本身,对吗?)

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

  4. 实现此接口的类的实例是否将具有此接口的 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);
        }
      };
}

标签: javaobjectinterfaceoverridingnew-operator

解决方案


new SubtitleDecoderFactory() { ... }创建实现接口的匿名内部类SubtitleDecoderFactory的实例。然后将此实例分配给静态字段DEFAULT(“接口主体中的每个字段声明都是隐式public的,,staticfinal”,JLS,§9.3)。

在程序的其余部分,匿名类的实例可以通过SubtitleDecoderFactory.DEFAULT.


推荐阅读