java对象中什么时候适合用static修饰符

您所在的位置:网站首页 java中静态成员变量 java对象中什么时候适合用static修饰符

java对象中什么时候适合用static修饰符

2023-04-25 09:20| 来源: 网络整理| 查看: 265

使用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 orgPushOrderRecords = new CopyOnWriteArrayList(); public void addOrgPushOrder(final OrganizationPushOrderRecordEntity organizationPushOrderRecord) { orgPushOrderRecords.add(organizationPushOrderRecord); } }

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3