java对象中什么时候适合用static修饰符踩坑解决记录

 更新时间:2023年09月21日 10:08:54   作者:GuangHui  
这篇文章主要为大家介绍了java对象中什么时候适合用static修饰符踩坑解决记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

static修饰符

使用static修饰符可以使成员变量或方法具有类级别而非实例级别的特性,即被静态修饰的成员在所有该类的实例之间是共享的。因此,应该根据具体情况考虑何时适合使用static修饰符。

适用static修饰符场景

  • 常量定义

经常使用的常量可以使用静态修饰符声明为静态常量,这样就可以在整个应用程序中访问它们。

例如:public static final int MAX_VALUE = 1000;

  • 工厂方法

在某些情况下,工厂方法可以使用静态修饰符创建一个对象实例。

例如:public static Logger getLogger();

  • 共享的资源

将函数或成员变量设置为静态的,可以使它们在所有类的实例之间共享。静态变量和方法被所有实例共享,因此可以用来实现共享的资源库。

例如:private static Connection conn;

  • 嵌套类

在Java中,嵌套类可以是静态的,静态嵌套类只能访问外部类的静态成员,因此如果嵌套类没有必要访问外部类的非静态成员,那么可以使用静态嵌套类。

例如:public static class MyStaticNestedClass { }

需要注意的是,使用静态修饰符需要谨慎,因为它们具有全局性。静态方法和变量可以在不同的地方被访问和修改,因此可能会引起非预期的副作用。因此,应该根据具体情况谨慎使用静态修饰符。

不适用static修饰符场景

  • 实例变量

实例变量与类的每个实例相关联,它们的值在每个实例之间不共享。因此,在多个实例之间共享变量时,不能使用静态变量。

  • 实例方法

实例方法是与类的每个实例相关联的方法,它们只能通过创建对象实例来访问。因为静态方法在每个实例之间共享,所以不能用它们来访问实例数据或实例方法。

  • 单例模式

在单例模式中,只应该有一个实例,因此不能使用静态变量和方法,因为它们会在整个应用程序中共享。

  • 线程不安全的类

如果一个类是线程不安全的,那么使用静态变量和方法来访问它们可能是危险的,因为该类可能会在多个线程之间共享,并可能导致意外的后果。

总之,如果想要在多个实例之间共享数据或方法,那么静态修饰符是一个合理的选择。但是,需要明确静态变量和方法适合的范围,而不是随意的使用它们,这样才能确保代码的正确性和可维护性。

另外,需要注意的是,使用静态修饰符还存在一些需要特别注意的问题:

  • 静态代码块的执行顺序

Java中,静态初始化器和变量初始化器代码块是随着类的初始化而执行的。当类第一次被加载时,它所有的静态代码块会被执行,因此必须注意执行顺序,避免引用尚未初始化的变量。

  • 静态变量的生命周期

静态变量的生命周期是在整个应用程序中,它们不会像实例变量那样在实例销毁时被释放。因此,如果将静态变量赋予了不正确的值,那么这个值将会一直存在,直到程序终止。

  • 并发访问问题

由于静态变量和方法可以在不同的地方被访问和修改,因此在多线程环境下可能会出现并发访问问题,导致线程安全问题。需要使用线程同步控制来避免这种情况。

总的来说,在使用静态修饰符时,需要考虑到它们的适用范围,并谨慎使用,才能避免意外的副作用和错误,并确保代码的正确性和可维护性。

踩坑

讲一个,我刚犯的错:

public class OrgPushRuleMatchResultBO {
    /**
     * 规则配置匹配成功后,构建的组织推单记录列表
     */
    private static List<OrganizationPushOrderRecordEntity> orgPushOrderRecords = new CopyOnWriteArrayList<>();
    public void addOrgPushOrder(final OrganizationPushOrderRecordEntity organizationPushOrderRecord) {
        orgPushOrderRecords.add(organizationPushOrderRecord);
    }
}

定义对象的时候,我对可能不安全的类加上了static,当时考虑到ArrayList是线程不安全的,所以特意使用了CopyOnWriteArrayList。

但没成想,这里的list是被实例之间共享的,这样多个实例都可以访问到这个list,那么就不是我想要的结果了,我想要的是彼此不可见。

好基础的bug啊,算是补上了。

以上就是java对象中什么时候适合用static修饰符踩坑解决记录的详细内容,更多关于java对象static修饰符的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis-Plus Mapper 接口方法操作详解

    MyBatis-Plus Mapper 接口方法操作详解

    MyBatis-Plus的BaseMapper提供了丰富的开箱即用方法,所有方法都不需要编写SQL即可使用,可以满足95%以上的日常开发需求,本文给大家介绍MyBatis-Plus Mapper 接口方法详解,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Maven项目中pom.xml父子模块配置小结

    Maven项目中pom.xml父子模块配置小结

    Maven父子模块结构通过pom.xml实现配置复用、版本统一和批量构建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Java NIO 文件通道 FileChannel 用法及原理

    Java NIO 文件通道 FileChannel 用法及原理

    这篇文章主要介绍了Java NIO 文件通道 FileChannel 用法和原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java中fastjson生成和解析json数据(序列化和反序列化数据)

    java中fastjson生成和解析json数据(序列化和反序列化数据)

    本篇文章主要介绍了java中fastjson生成和解析json数据(序列化和反序列化数据),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • 从Maven到Spring Boot实战教程

    从Maven到Spring Boot实战教程

    本文系统梳理了Java后端开发的核心技术栈,从Maven项目管理到Spring Boot实战,从MyBatis持久层到Spring MVC Web开发,涵盖了项目开发的全流程与关键知识点,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 将SpringBoot的Jar注册成Windows服务的实现方法

    将SpringBoot的Jar注册成Windows服务的实现方法

    当前项目有个地图编辑器,后端用的是SpringBoot框架,外网刚好有一台空闲的Windows服务器就直接拿来用了,将Java程序部署成Windows服务可以用WinSW (Windows Service Wrapper)来实现,文中有详细的操作步骤,需要的朋友可以参考下
    2023-11-11
  • Java输入流Scanner/BufferedReader使用方法示例

    Java输入流Scanner/BufferedReader使用方法示例

    这篇文章主要介绍了Java输入流Scanner/BufferedReader使用方法,大家看示例吧
    2013-11-11
  • 解决IDEA开发工具右侧没有Maven工具栏的问题

    解决IDEA开发工具右侧没有Maven工具栏的问题

    这篇文章主要给大家解决了IDEA开发工具右侧没有Maven工具栏的问题,文中有详细的解决步骤,如果有遇到一样问题的小伙伴,可以参考阅读本文
    2023-09-09
  • Java泛型的继承和实现操作示例

    Java泛型的继承和实现操作示例

    这篇文章主要介绍了Java泛型的继承和实现操作,结合实例形式分析了java泛型类的继承以及泛型接口的实现相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • mybatis中点击mapper接口快速定位到对应xml中sql方式

    mybatis中点击mapper接口快速定位到对应xml中sql方式

    这篇文章主要介绍了mybatis中点击mapper接口快速定位到对应xml中sql方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论