Ръководство за предварителните условия на Гуава

1. Общ преглед

В този урок ще покажем как да използваме класа Предварителни условия на Google Guava .

Класът Предварителни условия предоставя списък със статични методи за проверка на извикване на метод или конструктор с валидни стойности на параметри. Ако предварително условие е неуспешно, се създава специално приспособление за изключение.

2. Предварителните условия на Google Guava

Всеки статичен метод в класа Предварителни условия има три варианта:

  • Без аргументи. Изключенията се извеждат без съобщение за грешка
  • Допълнителен аргумент на обект , действащ като съобщение за грешка. Изключенията се извеждат със съобщение за грешка
  • Допълнителен аргумент String с произволен брой допълнителни аргументи на Object , действащи като съобщение за грешка с заместител. Това се държи малко като printf , но за GWT съвместимост и ефективност позволява само % s индикатори

Нека да разгледаме как да използваме класа Предварителни условия .

2.1. Зависимост на Maven

Нека започнем с добавяне на зависимостта на библиотеката Гуава от Google в pom.xml :

 com.google.guava guava 29.0-jre 

Най-новата версия на зависимостта може да бъде проверена тук.

3. checkArgument

В метод checkArgument на класа Предпоставки гарантира истинността на параметрите предавани на метода се обажда. Този метод приема булево условие и изхвърля IllegalArgumentException, когато условието е невярно.

Нека да видим как можем да използваме този метод с някои примери.

3.1. Без съобщение за грешка

Можем да използваме checkArgument, без да предаваме допълнителен параметър на метода checkArgument :

@Test public void whenCheckArgumentEvaluatesFalse_throwsException() { int age = -18; assertThatThrownBy(() -> Preconditions.checkArgument(age > 0)) .isInstanceOf(IllegalArgumentException.class) .hasMessage(null).hasNoCause(); }

3.2. Със съобщение за грешка

Можем да получим смислено съобщение за грешка от метода checkArgument , като предадем съобщение за грешка:

@Test public void givenErrorMsg_whenCheckArgEvalsFalse_throwsException() { int age = -18; String message = "Age can't be zero or less than zero."; assertThatThrownBy(() -> Preconditions.checkArgument(age > 0, message)) .isInstanceOf(IllegalArgumentException.class) .hasMessage(message).hasNoCause(); }

3.3. Със съобщение за грешка в шаблон

Можем да получим смислено съобщение за грешка заедно с динамични данни от метода checkArgument , като предадем съобщение за грешка:

@Test public void givenTemplateMsg_whenCheckArgEvalsFalse_throwsException() { int age = -18; String message = "Age should be positive number, you supplied %s."; assertThatThrownBy( () -> Preconditions.checkArgument(age > 0, message, age)) .isInstanceOf(IllegalArgumentException.class) .hasMessage(message, age).hasNoCause(); } 

4. checkElementIndex

Методът checkElementIndex проверява дали индексът е валиден индекс в списък, низ или масив от определен размер. Индексът на елемент може да варира от 0 включително до изключителен размер. Не предавате директно списък, низ или масив, а само неговия размер. Този метод изхвърля IndexOutOfBoundsException, ако индексът не е валиден индекс на елемент, в противен случай връща индекс, който се предава на метода.

Нека да видим как можем да използваме този метод, като показваме смислено съобщение за грешка от метода checkElementIndex чрез предаване на съобщение за грешка, когато извежда изключение:

@Test public void givenArrayAndMsg_whenCheckElementEvalsFalse_throwsException() { int[] numbers = { 1, 2, 3, 4, 5 }; String message = "Please check the bound of an array and retry"; assertThatThrownBy(() -> Preconditions.checkElementIndex(6, numbers.length - 1, message)) .isInstanceOf(IndexOutOfBoundsException.class) .hasMessageStartingWith(message).hasNoCause(); }

5. checkNotNull

Методът checkNotNull проверява дали стойността, предоставена като параметър, е нула. Връща стойността, която е била проверена. Ако стойността, която е предадена на този метод, е нула, тогава се изхвърля NullPointerException .

След това ще покажем как да използваме този метод, като покажем как да получим смислено съобщение за грешка от метода checkNotNull чрез предаване на съобщение за грешка:

@Test public void givenNullString_whenCheckNotNullWithMessage_throwsException () { String nullObject = null; String message = "Please check the Object supplied, its null!"; assertThatThrownBy(() -> Preconditions.checkNotNull(nullObject, message)) .isInstanceOf(NullPointerException.class) .hasMessage(message).hasNoCause(); }

Също така можем да получим смислено съобщение за грешка въз основа на динамични данни от метода checkNotNull , като предадем параметър на съобщението за грешка:

@Test public void whenCheckNotNullWithTemplateMessage_throwsException() { String nullObject = null; String message = "Please check the Object supplied, its %s!"; assertThatThrownBy( () -> Preconditions.checkNotNull(nullObject, message, new Object[] { null })) .isInstanceOf(NullPointerException.class) .hasMessage(message, nullObject).hasNoCause(); }

6. checkPositionIndex

Методът checkPositionIndex проверява дали индексът, предаден като аргумент на този метод, е валиден индекс в списък, низ или масив с определен размер. Индексът на позицията може да варира от 0 включително до размера включително. Не предавате директно списъка, низа или масива, просто подавате неговия размер.

Този метод хвърля IndexOutOfBoundsException, ако предаденият индекс не е между 0 и зададения размер, в противен случай връща стойността на индекса.

Нека да видим как можем да получим смислено съобщение за грешка от метода checkPositionIndex :

@Test public void givenArrayAndMsg_whenCheckPositionEvalsFalse_throwsException() { int[] numbers = { 1, 2, 3, 4, 5 }; String message = "Please check the bound of an array and retry"; assertThatThrownBy( () -> Preconditions.checkPositionIndex(6, numbers.length - 1, message)) .isInstanceOf(IndexOutOfBoundsException.class) .hasMessageStartingWith(message).hasNoCause(); }

7. checkState

Методът checkState проверява валидността на състоянието на обект и не зависи от аргументите на метода. Например, Iterator може да използва това, за да провери дали е извикан next преди всяко повикване за премахване. Този метод изхвърля IllegalStateException, ако състоянието на обект (логическа стойност, предадена като аргумент на метода) е в невалидно състояние.

Нека да видим как можем да използваме този метод, като показваме смислено съобщение за грешка от метода checkState чрез предаване на съобщение за грешка, когато извежда изключение:

@Test public void givenStatesAndMsg_whenCheckStateEvalsFalse_throwsException() { int[] validStates = { -1, 0, 1 }; int givenState = 10; String message = "You have entered an invalid state"; assertThatThrownBy( () -> Preconditions.checkState( Arrays.binarySearch(validStates, givenState) > 0, message)) .isInstanceOf(IllegalStateException.class) .hasMessageStartingWith(message).hasNoCause(); }

8. Заключение

В този урок илюстрирахме методите на класа PreConditions от библиотеката Guava. Класът Предварителни условия предоставя колекция от статични методи, които се използват за проверка, че метод или конструктор е извикан с валидни стойности на параметри.

Кодът, принадлежащ на горните примери, може да бъде намерен в проекта GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.