1. 概述

在这个教程中,我们将探讨Java辅助类和工具类的区别。首先,我们将分别解释它们的含义,并学习如何创建它们。

2. Java辅助类

辅助类为Java程序的整体运行提供必要的功能。辅助类包含其他类用来执行重复任务的方法,这些任务并非应用程序的核心目的

顾名思义,它们通过提供补充其他类服务的功能来帮助它们,执行日常和重复性的任务,使整个代码库模块化并在多个类之间可重用。

一个辅助类可以实例化,可能包含实例变量,实例方法和静态方法

在我们的应用中可以存在多个辅助类实例。当不同的类共享共同的功能时,我们可以将这些功能组合成一个辅助类,使其在整个应用中特定类之间可访问。

2.1. 如何创建Java辅助类

我们将通过一个示例辅助类来进一步理解这个概念。

创建辅助类时,我们使用默认访问修饰符(如MyHelperClass)。默认访问修饰符确保只有同一包内的类才能访问这个类、其方法和变量:

class MyHelperClass {

    public double discount;

    public MyHelperClass(double discount) {
        if (discount > 0 && discount < 1) {
            this.discount = discount;
        }
    }

    public double discountedPrice(double price) {
        return price - (price * discount);
    }

    public static int getMaxNumber(int[] numbers) {
        if (numbers.length == 0) {
            throw new IllegalArgumentException("Ensure array is not empty");
        }
        int max = numbers[0];
        for (int i = 1; i < numbers.length; i++) {
            if (numbers[i] > max) {
                max = numbers[i];
            }
        }
        return max;
    }

    public static int getMinNumber(int[] numbers) {
        if (numbers.length == 0) {
            throw new IllegalArgumentException("Ensure array is not empty");
        }
        int min = numbers[0];
        for (int i = 1; i < numbers.length; i++) {
            if (numbers[i] < min) {
                min = numbers[i];
            }
        }
        return min;
    }
}

定义完类后,可以根据需要添加相关实例和静态方法。

由于辅助类可以实例化,所以它可以有实例方法

如上代码片段所示,MyHelperClass中包含了实例方法和静态方法:

@Test
void whenCreatingHelperObject_thenHelperObjectShouldBeCreated() {
    MyHelperClass myHelperClassObject = new MyHelperClass(0.10);
    assertNotNull(myHelperClassObject);
    assertEquals(90, myHelperClassObject.discountedPrice(100.00));

    int[] numberArray = {15, 23, 66, 3, 51, 79};
    assertEquals( 79, MyHelperClass.getMaxNumber(numberArray));
    assertEquals(3, MyHelperClass.getMinNumber(numberArray));
}

从测试中可以看出,已经创建了辅助对象。辅助类中的静态方法是通过类名直接访问的。

3. Java工具类

Java中的工具类是一个提供在整个应用中使用的静态方法的类。工具类的静态方法用于执行应用程序中的常见操作。

工具类不能被实例化,并且通常没有静态变量,是无状态的。我们将工具类声明为*最终类,并且所有方法都是静态的*。

由于我们不希望创建工具类的实例,因此会引入一个私有构造函数。拥有一个私有构造函数意味着Java不会为我们的工具类创建默认构造函数,构造函数可以为空。

工具类的目的是为程序中的某些功能提供执行方法,而主类专注于解决核心问题。

工具类的方法通过类名进行访问,这使得我们的代码在使用时更加灵活且保持模块化。

Java中有一些工具类,例如java.util.Arraysjava.lang.Mathjava.util.Scannerjava.util.Collections等。

3.1. 如何创建Java工具类

创建工具类与创建辅助类的过程有所不同,但有一些细节上的差异。

创建工具类时,**我们使用public访问修饰符,并且声明类为final**。在创建工具类时使用final关键字表示类是不可变的,不能被继承或实例化。

让我们创建一个名为MyUtilityClass的工具类:

public final class MyUtilityClass {

    private MyUtilityClass(){}

    public static String returnUpperCase(String stringInput) {
        return stringInput.toUpperCase();
    }

    public static String returnLowerCase(String stringInput) {
        return stringInput.toLowerCase();
    }

    public static String[] splitStringInput(String stringInput, String delimiter) {
        return stringInput.split(delimiter);
    }

}

另一个规则是,工具类的所有方法都是静态的,带有public访问修饰符。

由于工具类只包含静态方法,这些方法只能通过类名来调用:

@Test
void whenUsingUtilityMethods_thenAccessMethodsViaClassName(){
    assertEquals(MyUtilityClass.returnUpperCase("iniubong"), "INIUBONG");
    assertEquals(MyUtilityClass.returnLowerCase("AcCrA"), "accra");
}

如上所示,工具类的returnUpperCase()returnLowerCase()方法仅通过类名由其调用者访问。

4. Java辅助类与工具类

Java中的辅助类和工具类通常具有相同的目的。工具类可以视为通用的辅助类,开发人员有时会交替使用这两个术语

这是因为它们通过提供处理应用程序中非核心功能的任务方法,来补充其他类。

尽管它们非常相似,但它们之间仍存在一些微妙的区别:

  • 辅助类可以实例化,而工具类不能实例化,因为它们有私有构造函数。
  • 辅助类可以有实例变量,并且有实例和静态方法。
  • 工具类只有静态变量和方法。
  • 工具类通常在我们的应用中具有全局范围,而辅助类总是具有包范围。

5. 总结

在这篇文章中,我们详细探讨了Java中的辅助类和工具类。我们还发现,由于它们在应用中的使用方式,辅助类和工具类在本质上非常相似。

我们深入研究了如何创建辅助或工具类。

在构建Java健壮应用时,我们应该始终记住将执行重复任务但独立的方法分组到辅助或工具类中。有时,创建工具或辅助类的软件工程师可能会违反Java面向对象编程范式,但这样做可以使我们的代码库更加模块化和可重用。

如往常一样,本教程的代码可以在GitHub上找到。