Java中的final关键字和单例设计模式

1. final 关键字

定义final 关键字表示“最终”,用于修饰类、方法、变量,限制其扩展或修改。


1.1 final 的修饰范围与作用
修饰对象作用示例
该类不能被继承(最终类)public final class StringUtils { ... }
方法该方法不能被子类重写(最终方法)public final void init() { ... }
变量变量只能被赋值一次(常量)final int MAX_VALUE = 100;

变量修饰的注意事项

  • 基本类型变量:数据不能被改变。
    final int AGE = 25;
    // AGE = 30; // 编译报错!
    
  • 引用类型变量地址不能被改变,但地址指向的对象内容可变。
    final List<String> list = new ArrayList<>();
    list.add("Java"); // 合法
    // list = new LinkedList<>(); // 编译报错!
    

2. 常量(static final

定义:使用 static final 修饰的成员变量称为常量,用于记录系统配置等不可变数据。

命名规范

  • 全大写字母,单词间用下划线连接(如 MAX_SIZE)。

代码示例

public class Constant {
    public static final String SCHOOL_NAME = "传智教育";
    public static final int MAX_STUDENTS = 1000;
}

优势与原理

  1. 可读性与维护性:通过常量名明确语义,避免魔法数值。
  2. 宏替换:编译时,常量会被替换为字面量,性能与直接使用字面量一致。

3. 单例设计模式

核心目标:确保一个类只能创建一个对象,节省内存并保证全局唯一性。


3.1 饿汉式单例

特点:类加载时立即创建对象(线程安全,但可能浪费内存)。

实现步骤

  1. 私有化构造器。
  2. 定义静态变量存储唯一对象。
  3. 提供静态方法返回对象。

代码示例

public class SingletonEager {
    // 1. 私有构造器
    private SingletonEager() {}
    
    // 2. 静态变量存储对象
    private static final SingletonEager INSTANCE = new SingletonEager();
    
    // 3. 静态方法返回对象
    public static SingletonEager getInstance() {
        return INSTANCE;
    }
}

3.2 懒汉式单例

特点:延迟加载,首次调用时创建对象(需解决线程安全问题)。

实现步骤

  1. 私有化构造器。
  2. 定义静态变量但不初始化。
  3. 在静态方法中判断并创建对象(需加锁)。

代码示例(基础版,非线程安全):

public class SingletonLazy {
    // 1. 私有构造器
    private SingletonLazy() {}
    
    // 2. 静态变量(不初始化)
    private static SingletonLazy instance;
    
    // 3. 静态方法返回对象
    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

线程安全改进(双重检查锁):

public class SingletonLazy {
    private static volatile SingletonLazy instance;
    
    private SingletonLazy() {}
    
    public static SingletonLazy getInstance() {
        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
}

3.3 单例模式的应用场景
  1. 全局配置管理:如数据库连接池、日志管理器。
  2. 工具类对象:如 Runtime.getRuntime()
  3. 资源共享对象:如线程池、缓存对象。

优势

  • 避免重复创建对象,节省内存。
  • 确保全局唯一性,避免数据不一致。

4. 总结

特性final 关键字单例模式
核心作用限制扩展或修改确保类只有一个实例
常见应用常量、工具类、不可变类全局配置管理、资源共享对象
设计要点明确不可变性,避免误操作构造器私有化、静态方法控制对象创建

最佳实践

  • final 使用:优先用于工具类、常量定义。
  • 单例选择:高并发场景用饿汉式,资源敏感场景用懒汉式(需处理线程安全)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值