5

のためにjava.util.concurrent.BlockingQueue

メソッドの Java 仕様によるcontains(Object o)

以前に次のような新しいオブジェクトを挿入した場合:

Task task = new Task("taskname", "somevalue"); 
queue.put(task);

その上で。そして後でこれを試してみてください:

Task task = new Task("taskname", "somevalue"); 
queue.contains(task);

BlockingQueue は単なるインターフェースであるため、Java の仕様により、これは true を返す必要がありますか?

Taskクラスなので、比較はSerializableフィールド値に基づいて行われますよね?

4

3 に答える 3

11

動作は、Taskクラスがメソッドをオーバーライドするかどうかによって異なりますequals。メソッドのロジックに応じてequals、これら 2 つのタスクmay/may notは等しくなります。

ブロッキングキューのJavaドキュメントから

boolean contains(オブジェクト o)

このキューに指定された要素が含まれている場合は true を返します。より正式には、このキューに o.equals(e) のような要素 e が少なくとも 1 つ含まれている場合にのみ true を返します。

equalsメソッドがオーバーライドされていない場合、 Java は等値チェック (オブジェクト参照が等しいかどうかをチェックする)のequalsメソッドを使用します。Object

   public boolean equals(Object obj) {
    return (this == obj);
}

これらは 2 つの異なるオブジェクトであるため、オブジェクト参照 ID は異なり、したがってcontainsが返されfalseます。

于 2013-02-18T06:35:55.040 に答える
1

BlockingQueue は単なるインターフェースであるため、Java の仕様により、これは true を返す必要がありますか?

これは奇妙な質問です。queueオブジェクトが作成されている限り、その interface( BlockingQueue) によって約束されたとおりに動作する必要があります。

インターフェイスは、それ自体でインスタンス化できないという点で抽象的ですが、それを実装するクラスによって作成されるすべてのオブジェクトの共通の契約です。

具体的な質問に関しては、クラスがそのメソッドを定義する方法に依存するかどうかqueue.contains(task)が返されます。trueTaskequals

于 2013-02-18T06:37:26.727 に答える
0

それは、メソッドに記述するロジックが何であるかによって異なりますcontains()。インスタンス化しようとするBlockingQueue<Object>と、いくつかのメソッドを実装する必要contains()があり、それらのメソッドの一部です。

BlockingQueue<Object> a = new BlockingQueue<Object>()
{

    @Override
    public Object remove()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object poll()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object element()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object peek()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int size()
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isEmpty()
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Iterator<Object> iterator()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object[] toArray()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T[] toArray( T[] a )
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean containsAll( Collection< ? > c )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean addAll( Collection< ? extends Object> c )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean removeAll( Collection< ? > c )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean retainAll( Collection< ? > c )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void clear()
    {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean add( Object e )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean offer( Object e )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void put( Object e ) throws InterruptedException
    {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean offer( Object e, long timeout, TimeUnit unit ) throws InterruptedException
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object take() throws InterruptedException
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object poll( long timeout, TimeUnit unit ) throws InterruptedException
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int remainingCapacity()
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean remove( Object o )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean contains( Object o )
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int drainTo( Collection< ? super Object> c )
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int drainTo( Collection< ? super Object> c, int maxElements )
    {
        // TODO Auto-generated method stub
        return 0;
    }
};
于 2013-02-18T06:37:39.320 に答える