java – 有更优雅的方式吗? (不能更具描述性.)

我有三个代表音乐作品的非静态类.这些是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();

}

让调用代码处理它需要做的任何转换?

点赞