我有三个代表音乐作品的非静态类.这些是Score,Part和Note类.
分数包含实例变量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 construtor传递特定Score实例的解析.然后将注释添加到ArrayList< Note>相应的Part实例的注释,部分添加到ArrayList< Part> Score实例的一部分.
我使用int resolution作为Note构造函数参数的解决方案似乎并不优雅,因为有许多笔记属于同一分数,即分辨率是分数的属性而不是笔记的属性.
有没有办法通过从Note类中引用相应的Score对象来获得解析,而不是通过Note类的构造函数或者其他一些解决方案传递解析?
最佳答案 似乎分辨率与分数有关(基于您的设计),而不是注释 – 为什么不更改Note#getDuration的方法签名来计算特定分辨率的持续时间:
public double getDuration(int resolution) {
double duration = (double) (getEndStamp() - getStartStamp()) / resolution;
return duration;
}
现在可以将相同的注释添加到具有不同分辨率的不同分数.
或者甚至更好,为什么你不回复:
public long getDuration() {
return getEndStamp() - getStartStamp();
}
让调用代码处理它需要做的任何转换?