我有三个代表音乐作品的非静态类。这些是分数,部分和音符类。
Score 包含ArrayList<Part>
表示乐谱的多个乐器声部的实例变量,Part 包含ArrayList<Note>
表示音符序列的实例变量。
public class Score {
private ArrayList<Part> parts;
private int resolution;
public Score(int resolution) {
parts = new ArrayList<Part>();
this.resolution = resolution;
}
public void addPart(Part part) {
parts.add(part);
}
public ArrayList<Part> getParts() {
return parts;
}
public int getResolution() {
return resolution;
}
}
public class Part {
private ArrayList<Note> notes;
public Part() {
notes = new ArrayList<Note>();
}
public void addNote(Note note) {
notes.add(note);
}
public ArrayList<Note> getNotes() {
return notes;
}
}
public class Note() {
private long startStamp;
private long endStamp;
private int resolution;
public Note(long startStamp, long endStamp, int resolution) {
this.startStamp = startStamp;
this.endStamp = endStamp;
this resolution = resolution;
}
public double getDuration() {
int duration = (double) (getEndStamp() - getStartStamp()) / resolution;
return duration;
}
}
每个音符的持续时间是使用分数分辨率计算的。每次实例化音符时,都会通过音符构造器传递特定乐谱实例的解析。Note 然后添加到ArrayList<Note> notes
对应的 Part 实例,part 添加到ArrayList<Part> parts
Score 实例。
我使用int resolution
Note 构造函数参数的解决方案似乎并不优雅,因为有许多音符属于同一乐谱,即分辨率是乐谱的属性而不是音符的属性。
有没有办法通过从 Note 类内部引用相应的 Score 对象来获得分辨率,而不是通过 Note 类的构造函数或其他解决方案传递分辨率?