java - 我应该如何设计具有继承的枚举?

标签 java inheritance enums functional-programming

我正在尝试枚举解析数据(ID3 标签)的函数。目前,我有一个如下所示的枚举:

enum Id3V1Layout {
  HEADER(range(fromString(), 0, 3)),
  TITLE(range(fromString(), 3, 33)),
  ARTIST(range(fromString(), 33, 63)),
  ALBUM(range(fromString(), 63, 93)),
  YEAR(range(fromString(), 93, 97)),
  /** length is 30 if zero bit != 0, else 28 */
  COMMENT(b -> range(fromString(), 97, b[125] == 0 ? 125 : 127).parse(b)),
  TRACK(b -> b[125] == 0 ? range(v -> (int) v[0], 126, 127).parse(b) : -1),
  GENRE(b -> b[127] < 0 ? null : Genre.values()[b[127]]);

  public final Id3FieldParser parser;

  static Id3FieldParser range(Id3FieldParser fn, int from, int to) {
    return b -> fn.parse(Arrays.copyOfRange(b, from, to));
  }

  static Id3FieldParser fromString() {
    return bytes -> new String(bytes).trim();
  }

  Id3V1Layout(Id3FieldParser parser) {
    this.parser = parser;
  }
}

(简单说明:每个元素定义了如何解析特定字段。range是一个返回Id3FieldParser功能接口(interface)对象的方法。)

现在我的问题是:由于我想稍后实现ID3v2布局,如何使Id3V1Layout具有与Id3V2Layout相同的构造函数和方法?

我希望能够使用 Id3Layout,而不是硬编码 Id3V1LayoutId3V2Layout

但是枚举不能从抽象类继承,并且我无法在接口(interface)中定义构造函数或属性。

那么,如何在使用具有两个枚举都具有的属性的一个公共(public)类的同时,定义具有不同参数的不同元素呢?

最佳答案

正在寻找类似的东西吗?

class Id3Layout {
    public interface ParseLayout {
        Id3FieldParser getParser();
    }
    private static Id3FieldParser range(Id3FieldParser fn, int from, int to) {
        return b -> fn.parse(Arrays.copyOfRange(b, from, to));
    }
    private static Id3FieldParser fromString() {
        return bytes -> new String(bytes).trim();
    }
    public enum Id3LayoutVersions {
        V1(Id3V1Layout.values()),
        V2(Id3V2Layout.values());

        private ParseLayout[] parseLayout;
        private Id3LayoutVersions(ParseLayout[] pl) {
            parseLayout = pl;
        }
        public ParseLayout[] getParseLayoutTokens() { return parseLayout; }
    }
    public enum Id3V1Layout implements ParseLayout {
        HEADER(range(fromString(), 0, 3)),
        ...;
        private Id3FieldParser parser;
        private Id3V1Layout(Id3FieldParser parser) {
            this.parser = parser;
        }
        public Id3FieldParser  getParser() { return parser; }
    }
    public enum Id3V2Layout implements ParseLayout {
        HEADER(range(fromString(), 0, 3)),
        ...;
        private Id3FieldParser parser;
        private Id3V2Layout(Id3FieldParser parser) {
            this.parser = parser;
        }
        public Id3FieldParser  getParser() { return parser; }
    }

关于java - 我应该如何设计具有继承的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769550/

相关文章:

java - Gradle 可以在没有 main() 的情况下执行 TornadoFX 应用程序,而 IntelliJ 不能......为什么?

java - 什么等同于 Java World 中的 PHP Zend Framework

java - 循环链表帮助(Java)

java - 从 ArrayList 类继承出现问题, 'receiving non-static method can not be referenced in static context' 错误

java - 常量和简化枚举值访问

c - C 中枚举类型的溢出?

java - 问题包含 "onClick"和 getIntExtra

typescript - 在 TypeScript 中键入表示 "this very class"

swift - 基于 swift 2 中的另一个枚举创建一个枚举

java - 使用 Java 继承