6

最初の項目を選択する必要があるリストの前提条件チェックの最適なパターンを知りたいです。

言い換えれば、リストはすべきではなくnull、そのサイズは> 1であるべきだと思います。

この点で、グアバの checkPositionIndex は役に立たないことがわかりました。それどころか、直感に反すると思います。トリガーしないガードの後に​​概説されているように、checkArgumentではなくcheckPositionIndexを使用しているため、空のリストを爆破する以下の例を参照してください。

引数から .get(0) しても、位置 0 を確認するだけでは引数を検証するのに十分ではないようです。

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkPositionIndex;
import java.util.List;
import com.google.common.collect.Lists;
public class HowShouldIUseCheckPositionIndex {
  private static class ThingAMajig {
    private String description;
    private ThingAMajig(String description) {
      this.description = description;
    }
    @Override
    public String toString() {
      return description;
    }
  }
  private static void goByFirstItemOfTheseAMajigs(List<ThingAMajig> things) {
    checkNotNull(things);
    // Check whether getting the first item is fine
    checkPositionIndex(0, things.size()); // Looks intuitive but...
    System.out.println(things.get(0)); // Finally, help the economy!
    checkArgument(things.size() > 0); // This would have worked :(
  }
  public static void main(String[] args) {
    List<ThingAMajig> fullList =
        Lists.newArrayList(new ThingAMajig(
            "that thingy for the furnace I have been holding off buying"));
    List<ThingAMajig> emptyList = Lists.newLinkedList();
    goByFirstItemOfTheseAMajigs(fullList);
    // goByFirstItemOfTheseAMajigs(emptyList); // This *bombs*
  }
}
4

5 に答える 5

16

checkElementIndex()代わりに使用する必要があります。

checkPositionIndex()指定された位置が、要素を取得するための有効なインデックスではなく、新しい要素を挿入する有効な位置であることを保証します (つまりadd(0, obj)、空のリストで実行できます)。

于 2012-09-18T11:00:44.433 に答える
3

実際のところ、チェックを行う必要はまったくありません。

list.get(0)呼び出し自体は、基本的にまったく同じエラー メッセージをスローします。

しかし、チェックを明示的に行いたい場合は、はい、 checkElementIndexorを使用してくださいcheckArgument(!list.isEmpty())

于 2012-09-18T21:59:46.160 に答える
0

代わりに、hamcrest-matchers で valid4j を使用できます (Maven Central で org.valid4j:valid4j として見つかります)。

事前条件と事後条件の場合 (基本的にアサーション -> AssertionError のスロー):

import static org.valid4j.Assertive.*;

require(list, hasSize(greaterThan(0)));

または入力検証の場合 (カスタムの回復可能な例外をスローします):

import static org.valid4j.Validation.*;

validate(list, hasSize(greaterThan(0)), otherwiseThrowing(EmptyListException.class));

リンク:

于 2014-11-30T23:55:08.010 に答える
0

checkElementIndexを使用する

それは述べています:

Ensures that index specifies a valid element in an array, list or string of size size. An element index may range from zero, inclusive, to size, exclusive

于 2012-09-18T11:03:26.367 に答える
0

checkNotBlankメソッドのtwitter-commons実装を使用できます。Iterable が null ではなく、空でもないことを検証します。実装は次のとおりです。

/**
* Checks that an Iterable is both non-null and non-empty. This method does not check individual
* elements in the Iterable, it just checks that the Iterable has at least one element.
*
* @param argument the argument to validate
* @param message the message template for validation exception messages where %s serves as the
* sole argument placeholder
* @param args any arguments needed by the message template
* @return the argument if it is valid
* @throws NullPointerException if the argument is null
* @throws IllegalArgumentException if the argument has no iterable elements
*/
public static <S, T extends Iterable<S>> T checkNotBlank(T argument, String message,
      Object... args) {
  Preconditions.checkNotNull(argument, message, args);
  Preconditions.checkArgument(!Iterables.isEmpty(argument), message, args);
  return argument;
}

非常にシンプルで、すべてのイテラブルで動作します。

于 2012-09-18T11:10:17.220 に答える