📜  前提条件 |番石榴 |Java

📅  最后修改于: 2022-05-13 01:54:47.847000             🧑  作者: Mango

前提条件 |番石榴 |Java

简介:前提条件类提供了一个静态方法列表,用于检查方法或构造函数是否使用有效的参数值调用。如果先决条件失败,则会引发定制的异常。

  • 这些方法通常接受一个预期为真的布尔表达式。
  • 在 checkNotNull 的情况下,这些方法接受预期为非空的对象引用。
  • 相反,当传递 false/null 时,Preconditions 方法会引发未经检查的异常。

宣言 :

@GwtCompatible
public final class Preconditions
extends Object

示例 1:在此示例中,checkArgument 抛出IllegalArgumentException以指示 examplePre1 在调用 sqrt 时出错,因为传递的参数为负数。

// Returns the positive square
// root of the given value.
// throws IllegalArgumentException
// if the value is negative
public static double sqrt(double value)
{
    Preconditions.checkArgument(value >= 0.0, "negative value: %s", value);
    // calculate the square root
}
  
void examplePre1()
{
    // Function calling
    double ans = sqrt(-5.0);
}

示例 2:假设我们有一个将 List 作为参数的方法。调用此方法时,我们要检查列表是否不为空且不为空。该问题的简单Java解决方案如下所示:

// Method to check if passed list
// is null or empty
public void example(List myList)
{
    // To check if passed list is null
    if (myList == null) {
        throw new IllegalArgumentException("List must not be null");
    }
  
    // To check if passed list is empty
    if (myList.isEmpty()) {
        throw new IllegalArgumentException("List must not be empty");
    }
  
    // Function calling
    example(myList);
}

但是当我们使用 Guava 的 Preconditions 时,代码量明显减少。解决方案看起来像:

// Method to check if passed list
// is null or empty
public void example(List myList)
{
    // Check if list is null or not
    checkArgument(myList != null, "List must not be null");
  
    // Check if list is empty or not
    checkArgument(!myList.isEmpty(), "List must not be empty");
  
    // Function calling
    example(myList);
}

示例 3:如果想要验证年龄以确保它大于 18,可以使用 Precondition.checkArgument()。

// To check if age is greater than 18 or not
public static void validateAge(int age)
{
    // Guava Preconditions
    checkArgument(age > 18);
}

下表显示了 Guava Preconditions 提供的一些方法。

每种方法都有三种变体,如下所列:

  • 没有额外的参数:抛出任何异常而没有错误消息。
  • 一个额外的对象参数:任何异常都会抛出错误消息 object.toString()。
  • 一个额外的字符串参数:这个方法接受一个额外的字符串参数和任意数量的附加对象参数。它的行为类似于 printf,但为了 GWT 的兼容性和效率,它只允许 %s 指示符

第三种变体的示例:

checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
checkArgument(i < j, "Expected i = %s", i, j);

Guava Preconditions 提供的其他一些方法是:

要点:以下是关于番石榴先决条件的一些要点。

  • 当然可以使用这个类的方法来检查不是调用者错误的无效条件。不建议这样做,因为它会误导代码的未来读者。
  • 使用com.google.common的项目通常应避免使用 Objects.requireNonNull(Object)。相反,使用适合情况的 checkNotNull(Object) 或 Verify.verifyNotNull(Object) 中的任何一个。
  • 在 Preconditions 错误消息模板字符串中,仅支持“%s”说明符,不支持全部范围的 Formatter 说明符。

例子 :

// Java code to show implementation of
// Guava Preconditions
import com.google.common.base.Preconditions;
  
class GFG {
  
    // Driver code
    public static void main(String args[])
    {
  
        // Creating object of GFG Class
        GFG obj = new GFG();
  
        // try block
        try {
            System.out.println(obj.sum(5, null));
        }
  
        // catch block
        catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }
  
    // Method to compute sum of 2 Integers
    public int sum(Integer num1, Integer num2)
    {
        // Guava Preconditions
        num1 = Preconditions.checkNotNull(num1,
                                          "Illegal Argument, First parameter is Null.");
  
        // Guava Preconditions
        num2 = Preconditions.checkNotNull(num2,
                                          "Illegal Argument, Second parameter is Null.");
  
        return (num1 + num2);
    }
}

输出 :

Illegal Argument, Second parameter is Null.

参考:谷歌番石榴