【Java】静态方法多情况展示:类中的方法什么时候采用static修饰?工具方法、工厂方法、单例模式、静态初始化块。

       在Java中,使用static修饰方法时,表示这个方法属于类而不是对象。static方法在类加载时就已经存在,可以直接通过类名调用,而不需要先创建类的实例。

使用静态方法的几种情况:

1. 工具方法(Utility Methods)

       静态方法通常用于实现一些与类的实例状态无关的功能。这些方法通常称为工具方法,因为它们提供了一些通用的工具函数,可以用于多种情况。例如,常见的数学计算、字符串处理以及集合操作等都是使用静态方法来实现的。

public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
    
}

class test{

    public static void main(String[] args) {
       MathUtils.add(5,8);//类外直接通过类名调用,不需要创建实例。
    }
}

2. 工厂方法(Factory Methods)

        当使用静态方法创建对象实例时,可以在静态方法内部处理对象的创建细节,而不暴露这些细节给外部调用者。让我们通过一个例子来说明这一点:

      假设我们有一个汽车类 Car,它有一些复杂的初始化过程,包括设置各种属性、进行验证等操作。如果我们将这些初始化细节暴露给外部调用者,他们就需要了解这些细节并编写相应的代码来初始化汽车对象。这样做不仅会暴露类的实现细节,还会使代码变得复杂且难以维护。

    在这个示例中,Car 类定义了一个私有的构造方法和一个有的静态工厂方法 createCar()外部调用者可以通过调用工厂方法来创建 Car 对象,而不必了解对象创建的具体细节。工厂方法内部处理了复杂的初始化过程,并返回一个初始化完毕的 Car 实例。

        这种设计模式的好处是,将对象创建的细节封装在工厂方法内部,使得外部调用者无法直接访问或修改对象的创建过程,提高了代码的安全性封装性

public class Car {
    //汽车属性...
    private String model;
    private int year;
    private String color;
    private boolean validated;//该属性用于验证


    private void validate() {
        // 模拟验证操作
        System.out.println("正在校验汽车订单: " + model + "...");
        // 假设这里进行了一些复杂的验证过程
        //......
        //如果成功通过验证:
        this.validated = true;
        System.out.println("汽车订单 " + model + " 通过校验.");
    }

    //Car 类定义了一个私有的构造方法
    private Car(String model, int year, String color) {
        this.model = model;
        this.year = year;
        this.color = color;
        this.validated = false;
        //有很多参数
        // 模拟复杂的初始化过程
        //......这里很复杂
        validate();//如果成功通过验证: this.validated = true;
    }


//如果验证成功,汽车可以开始生产
    public void start() {
        if (validated) {
            System.out.println("开始生产: " + color + " " + year + " " + model + ".");
        } else {
            System.out.println("汽车订单并未通过校验. 无法开始生产.");
        }
    }


    //公有的静态工厂方法 createCar()
    public static Car createCar(String model, int year, String color) {
        // 在工厂方法内部处理对象的创建细节
        return new Car(model, year, color);
    }

    public static void main(String[] args) {
        // 使用工厂方法创建 Car 对象
        Car myCar = Car.createCar("Toyota Camry", 2022, "blue");
        myCar.start();
    }
}

运行结果:

3. 单例模式(Singleton Pattern):

       在单例模式中,静态方法用于获取类的唯一实例。通过将构造函数私有化,并提供一个静态方法来获取类的实例,可以确保在应用程序的整个生命周期内只存在一个实例。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) { 
            instance = new Singleton();
        }
        return instance;
    }
}

4. 静态初始化块(Static Initialization Blocks):

       静态方法还常用于静态初始化块中。静态初始化块是在类加载时执行的代码块,通常用于对静态变量进行初始化。在静态初始化块中可以调用静态方法来完成初始化工作。           

       假设我们有一个名为MathUtils的Java类,其中包含一个静态变量PI表示圆周率,我们可以使用静态初始化块来初始化这个变量。让我们看看如何在Java中使用静态初始化块:

public class MathUtils {
    // 静态变量,表示圆周率
    public static double PI;


    // 静态方法,用于计算圆周率
    private static double calculatePi() {
        // 这里只是一个简单的示例,实际可能需要更复杂的算法
        return 3.14159265359;
    }

    // 静态初始化块,在类加载时执行
    static {
        // 在这里可以进行复杂的计算,或者从其他地方获取值
        PI = calculatePi();// 静态方法还常用于静态初始化块中。
    }

  

    public static void main(String[] args) {
        // 在其他地方使用静态变量
        System.out.println("圆周率:" + MathUtils.PI);
    }
}

tips:需要注意的是,静态方法不能访问非静态成员变量和方法,因为它们在对象创建之前就已经存在,所以没有对象实例的上下文。

      小编有话说:如果觉得有用的话,可以给我三连鸭。是大学生所以懂大学生,分享大学生真正需要的东西。 关注我,给你更多干货!目标:10000粉丝嘿嘿~谢谢支持,爱你们!

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值