java - 順番 - List.add(E) がブール値を返すのに対し、List.Add(int, E) が void を返す理由




java listの配列 (2)

javadocを見ると、ArrayListにはオーバーロードされたaddメソッドがあることがわかりました。

public boolean add(E e)

指定された要素をこのリストの末尾に追加します。

そして

public void add(int index、E要素)

指定された要素をこのリストの指定された位置に挿入します。 現在その位置にある要素(存在する場合)とそれ以降の要素を右に移動します(インデックスに1を追加します)。

最初のものはbooleanを返し、2番目のものはvoid booleanだったことに気づきました。 結局のところ、最初のHASはbooleanを返すaddます。

戻り値:true(Collection.add(E)で指定)

それで私はCollection.add(E)に行きました:

boolean add(E e)

このコレクションに指定の要素が含まれていることを確認します(オプションの操作)。 呼び出しの結果としてこのコレクションが変更された場合はtrueを返します。 (このコレクションが重複を許可せず、指定された要素を既に含んでいる場合はfalseを返します。)

それで、私の質問は、 addがvoidではなくブール値を返すadd指定されているのはなぜですか? 私add何かをaddとき、私は手術をすることだけを期待するでしょう。

ArrayListとは対照的に、重複を許可しない他のデータ構造(セットなど)があることを私は理解しています。 しかしそれでも、問題は以下の方針に沿って解決することはできませんでした。

public void add(E e){
    if(e is not in set){
        add e;
    }
}

そのようにしてeが集合の中にあれば何の行動も取られない。 voidアプローチの代わりにbooleanを返すほうがよいのはなぜですか?

https://code.i-harness.com


Collection.addはかなり一般的な方法です(Javaの総称という意味ではありません - 広く適用可能という意味で)。 そのため、彼らは一般的に適用される戻り値を望んでいました。

一部のクラス( ArrayList )は常に要素を受け入れtrue 。そのため、常にtrueが返されtrue 。 これらのケースでは、戻り値の型のvoidも同じように優れているはずです。

しかし、 Setような他のものは時々要素を追加することを許可しないでしょう。 Setの場合、これは等しい要素がすでに存在していた場合に起こります。 それを知っておくと便利です。 もう1つの例は、制限されたコレクション(特定の数の要素しか保持できない)です。

「これを手動でチェックするだけではコードを作成できないのですか」と尋ねることができます。 たとえば、次のようにします。

if (!set.contains(item)) {
    set.add(item);
    itemWasAdded(item);
}

これはあなたが今できることよりも冗長ですが、全体ではありません。

if (set.add(item)) {
    itemWasAdded(item);
}

しかし、このアクション時の振る舞いはスレッドセーフではなく、マルチスレッドアプリケーションでは非常に重要になります。 たとえば、最初のコードスニペットでset.contains(item)set.contains(item)チェックの間に別のスレッドが等しい項目を追加した可能性があります。 マルチスレッドのシナリオでは、これら2つのアクションは実際には単一のアトミックアクションである必要があります。 メソッドからbooleanを返すことでそれが可能になります。


それは何も費用がかからず、特定の状況で役立つ可能性がある追加の情報だからです。 例えば:

Set<String> set = new HashSet<String>();
set.add("foobar");
boolean wasAlreadyThere = set.add("foobar");

そうでなければあなたがしなければならないだろう

boolean wasAlreadyThere = set.contains("foobar");
set.add("foobar");

これには2倍の作業が必要です(最初にルックアップし、次にルックアップして追加する必要があります)。





arraylist