Make the enclosing method “static“ or remove this set.

团队使用SonarQube进行代码质量管理时发现了一个S2696警告,该警告提示从非静态方法更新静态字段可能导致错误。问题涉及一个非静态方法设置静态ApplicationContext。解决方案包括添加注解忽略警告或调整字段为静态和同步。博客记录了这个问题及其潜在的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

团队引入了Sonar Qube做代码质量管理,反馈了一个问题:Make the enclosing method "static" or remove this set.

发生问题的地方在:

查了一下,是rule S2696

意思是:从非静态方法正确更新静态字段很难做到正确,如果有多个类实例和/或多个线程在运行,很容易导致错误。 理想情况下,静态字段仅从同步静态方法中更新。 

 解决方法:

1.adding @SuppressWarnings("squid:S2696") to the top of the offending method causes Sonar to ignore that warning completely.

2.

@Setter
private static volatile ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
    setContext(ac);
}

未经验证~先记录一下 

 

### Java 内部类实例化解决方案 当处理内部类(non-static nested class)时,默认情况下创建其对象确实需要先有一个外部类的对象。这是因为非静态内部类持有对外部类实例的隐式引用。 为了绕过这一需求并简化内部类的使用,可以考虑将内部类声明为静态嵌套类(static nested class)。通过这种方式,不再强制要求拥有外部类的实例即可创建内部类的对象[^1]: ```java public class OuterClass { private String outerField; // 将内部类定义为静态 public static class StaticInnerClass { public void displayMessage() { System.out.println("Static Inner Class"); } } } ``` 此时可以直接通过 `OuterClass.StaticInnerClass` 来访问和实例化该静态内部类而无需依赖于任何特定的 `OuterClass` 实例: ```java // 不需创建外层类实例就能直接创建内层类实例 OuterClass.StaticInnerClass innerObject = new OuterClass.StaticInnerClass(); innerObject.displayMessage(); ``` 如果出于设计考量无法使内部类变为静态,则另一种方法是确保每次创建内部类的时候都有一个有效的外部类实例存在。这通常意味着要遵循正常的构造逻辑,在适当的地方初始化这两个关联的对象。 需要注意的是,让外部类实现序列化接口虽然可以让内部类也具备序列化的功能,但这会带来额外的数据保存负担——即每当序列化内部类的一个实例时也会一并将对应的外部类实例一同序列化,这样的行为可能不是期望的结果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值