我正在尝试枚举解析数据(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
类,而不是硬编码 Id3V1Layout
或 Id3V2Layout
。
但是枚举不能从抽象类继承,并且我无法在接口(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/