美文网首页
java对象中什么时候适合用static修饰符-踩坑记

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

作者: GuangHui | 来源:发表于2023-04-18 09:33 被阅读0次

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

以下是几个适合使用static修饰符的场景

  1. 常量定义
    经常使用的常量可以使用静态修饰符声明为静态常量,这样就可以在整个应用程序中访问它们。
    例如:public static final int MAX_VALUE = 1000;

  2. 工厂方法
    在某些情况下,工厂方法可以使用静态修饰符创建一个对象实例。
    例如:public static Logger getLogger();

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

  4. 嵌套类
    在Java中,嵌套类可以是静态的,静态嵌套类只能访问外部类的静态成员,因此如果嵌套类没有必要访问外部类的非静态成员,那么可以使用静态嵌套类。
    例如:public static class MyStaticNestedClass { }

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

以下是一些不适合使用static修饰符的场景:

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

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

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

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

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

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

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

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

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

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


讲一个,我刚犯的错:

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修饰符,再来总结一下吧。 一、static修饰符 static修饰符...

  • 面向对象(十一)-Static

    Static 简介使用static修饰符声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于类、...

  • 2019-03-06 Java Interface

    Java static static 特点 static是一个修饰符,用于修饰成员。 static修饰的成员被所有...

  • 2019-03-07 Java static

    Java static static 特点 static是一个修饰符,用于修饰成员。 static修饰的成员被所有...

  • recyclerview notifyDataSetChange

    可能出现的原因 1.在子线程中调用了notifyDataSetChanged;2.适配器中数据源为空。 踩坑记(适...

  • 18、Static

    1.简介: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、...

  • 19、静态类、方法static

    1.简介: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、...

  • java基础-static

    概述 static 在java体系里的地位:java语言的一个修饰符,属于非访问修饰符,所谓访问修饰符就是控制访问...

  • 优化android程序

    优化java代码 1.尽量使用static和final修饰符 对于一些固定的类和方法尽量使用static修饰符,调...

  • Java之面向对象(一)

    面向对象的三大特性:继承,多态,封装。 修饰符: static 解析,在一个类中定义的static属性,方法是隶属...

网友评论

      本文标题:java对象中什么时候适合用static修饰符-踩坑记

      本文链接:https://www.haomeiwen.com/subject/nuehjdtx.html