问题:普通方法调用静态属性时,Sonar会认为有问题

这是我们经常用的,实现Spring的Bean工厂,写一个工具类, 开放一个静态方法:获取实体类

public class BeanHelper implements BeanFactoryAware {private static BeanFactory factory;/*** 获取实体类* * @param id* @return*/public static <T> T getBean(String id) {return (T) factory.getBean(id);}/*** 设置bean工厂* * @param beanFactory*/@Overridepublic void setBeanFactory(BeanFactory beanFactory) {BeanHelper.factory = beanFactory;}
}
复制代码

Sonar扫描会报:

Instance methods should not write to "static" fields Correctly updating a static field from a non-static method is tricky to get right and could easily lead to bugs if there are multiple class instances and/or multiple threads in play. Ideally, static fields are only updated from synchronized static methods. This rule raises an issue each time a static field is updated from a non-static method.

翻译:

正确地从非静态方法更新静态字段是很棘手的, 如果在运行中有多个类实例和 / 或多个线程, 则可以很容易地导致 bug。理想情况下, 静态字段只从同步静态方法更新。 每次从非静态方法更新静态字段时, 此规则将引发一个问题。

解决办法:对静态属性包装一个静态方法

public class BeanHelper implements BeanFactoryAware {private static BeanFactory factory;/*** 获取实体类* * @param id* @return*/public static <T> T getBean(String id) {return (T) factory.getBean(id);}private static void setFactory(BeanFactory factory) {BeanHelper.factory = factory;}/*** 设置bean工厂* * @param beanFactory*/@Overridepublic void setBeanFactory(BeanFactory beanFactory) {setFactory(beanFactory);}
}
复制代码

包装一个静态 setFactory 方法,Sonar扫描就不会产生问题,由于是静态方法,会被最先初始化,更近一步,可以在 setFactory 方法中,判断 BeanHelper.factory 是否为 null,不为 null 则不赋值,保证不会被多实例或多线程覆盖,此处就不详细写出了。

Sonar问题解决:普通方法调用静态属性相关推荐

  1. PHP中普通方法如何调用静态属性,php中的静态属性和静态方法如何调用

    静态属性.方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性). (推荐教程:php图文教程) 实例: header("content-type: ...

  2. php 类名访问静态属性,请问可以用类名直接调用静态属性吗?

    header("content-type:text/html;charset=utf-8"); class Human{ static public $name = "李 ...

  3. 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)

    Ⅰ.类属性.类方法(类和实例都能调用类属性和类方法) 类是一个特殊的对象,Python 中 一切皆对象:class AAA: #定义的类属于 类对象obj1 = AAA() #属于 实例对象 除了封装 ...

  4. 初学者python笔记(静态属性、类方法、静态方法、类的组合)

    文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...

  5. 静态属性、静态方法、静态代码块

    1.什么是静态属性.静态方法 用static修饰符修饰的属性和方法叫作静态属性和静态方法 静态属性和非静态属性的区别: 1.在内存中存放的位置不同:所有static修饰的属性和方法都存放在内存的方法区 ...

  6. python 类静态属性_python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  7. 关于JVM方法调用的那些事

    本文来说下JVM方法调用的那些事 文章目录 概述 方法调用 静态分派 动态分派 JVM动态分派实现 本文小结 概述 Java具备三种特性:封装.继承.多态. Java文件在编译过程中不会进行传统编译的 ...

  8. JavaScript 公有 私有 静态属性和方法

    1.公有属性和公有方法 这里的 name  age  都是参数传递进去 可以在外面直接实例化调用. 2.私有属性和方法 私有的只能在函数内部使用 作用域的原因 3.静态属性和静态方法 这里我首先 创建 ...

  9. php静态方法怎么调用非静态属性,关于静态方法不能调用类中的非静态属性的理解...

    class test{ public $a; public function game(){ echo "123"; } public static function name() ...

最新文章

  1. 数据系列:如何在Windows Azure虚拟机上设置SQL Server
  2. NodeJS基础2---2 Promise详解
  3. Linux之grep
  4. 【洛谷P2927 [USACO08DEC]拼图游戏Jigsaw Puzzles】深搜
  5. php 日志函数,php 写入日志函数
  6. windows比linux差在哪,怎么让新手理解Linux比Windows好在哪里!
  7. 真实经历:整整一年了,他是这样从程序员转型做产品经理的
  8. 电脑用户名_仁霸下料优化软件如何找回密码、更换绑定电脑?
  9. Linux下使用socket传输文件的C语言简单实现
  10. 【转】VS中常用图标提示含义
  11. clsq客户端android,Android NDK开发之 arm_neon.h文件ABI说明
  12. 【java学习之路】(java SE篇)014.Stream API
  13. OpenGL渲染YUV420P
  14. java中符号常量_Java中符号常量
  15. 第三方支付如何玩转大数据
  16. 粒子群优化算法实现寻找函数最值
  17. 一起聆听碳氮循环研究新动态,我们在苏州期待您的精彩分享和参与!
  18. 因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Link ID=135170 中的 about_Execution_Policies
  19. mysql在购物车中的应用_ajax在购物车中的应用
  20. 看见她力量丨中国铁建地产铁姐,内外多面,绽放光彩!

热门文章

  1. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 下载
  2. python3.8.5怎么用-python3.8 五分钟就可以入门
  3. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间
  4. python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码
  5. python开发需要掌握哪些知识-Python的8个基础知识点,新手必须背下来!
  6. python要学多久-python需要学多久?自学两年也很难达到企业标准!
  7. python软件安装步骤-Linux中Python 环境软件包安装步骤
  8. 重构-改善既有代码的设计读书笔记
  9. LeetCode Course Schedule II(拓扑排序)
  10. Qt运行一个实例进程