java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java对象static修饰符

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

作者: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修饰符的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文