【问题标题】:How to invoke contains directly on class rather than collection如何直接在类而不是集合上调用包含
【发布时间】:2012-06-11 14:13:48
【问题描述】:

我想知道如何能够直接在我的类而不是它的 ArrayList 变量上调用 contains 方法。最好的解释方式就是使用下面的代码。

感谢您的帮助。

public class Chord {
    ArrayList<Note> notes;
    // some more stuff not here
}

cmaj = new Chord("Cmaj");
cnote = new Note("C");

// what I have
cmaj.getNotes().contains(cnote);

// what I would like, is this possible, how?
cmaj.contains(cnote);

【问题讨论】:

  • 作为一个完全独立的主题,让Note 成为enum 而不是一个类可能更有意义(假设只有13 个可能的注释)。
  • 对于手头的项目来说,成为一个类是有意义的,因为关联的方法更多。这只是一个非常短的sn-p。谢谢你的建议

标签: java contains


【解决方案1】:

你可以自己写方法:

public class Chord {
    private final List<Note> notes;

    ...

    public boolean contains(Note note) {
        return notes.contains(note);
    }
}

【讨论】:

    【解决方案2】:

    这是代理方法的典型示例 (see proxy patter)。

    public class Chord {
        private final List<Note> notes = new ArrayList();
    
        public boolean contains(Note note) {
          return notes.contains(note);
        }
    
    }
    

    当您使用这种类型的方法时,您应该在将对象交付给客户端之前仔细检查是否设置了引用。如果你不注意你会得到 NullPointerException。并且尽量保持一致,如果你决定以这种方式使用包含,addremovereset 也应该被实现。然后不再需要吸气剂。

    【讨论】:

      【解决方案3】:

      在 chord 中编写一个 contains() 方法,该方法简单地将调用委托给 arraylist,如下所示:

      public class Chord {
          ArrayList<Note> notes;
      
          public boolean contains(Object o) {
             return notes.contains(o);
          }
      }
      

      【讨论】:

        【解决方案4】:

        添加一个方法contains封装arrayList的包含:

        public class Chord {
            ArrayList<Note> notes;
            // some more stuff not here
        
            public boolean contains(Note note){
                return notes.contains(note);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-01-22
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-20
          相关资源
          最近更新 更多