首页 > 解决方案 > sonarQube raises 使静态最终常量或非公共,并在 JNA 结构上需要时提供访问器

问题描述

我创建了以下适用于我的项目上下文的 JNA 结构:

    @FieldOrder({ "string", "stringSize" })
    public static class stringStruct extends Structure {
        public static class ByReference extends stringStruct implements Structure.ByReference {
        }
        public static class ByValue extends stringStruct implements Structure.ByValue {
        }
        public String string;
        public int stringSize;
    }

我对我的代码启动了 sonarQube 分析,但 sonarQube 引发以下错误:“将 stringSize 设为静态最终常量或非公共,并在需要时提供访问器。” 这很奇怪,因为我的结构中有两个字段,只有一个字段会引发这样的问题。

无论如何,如果我理解正确,关于这个问题,我应该做类似的事情来解决 stringSize 字段上的问题:

    @FieldOrder({ "string", "stringSize" })
    public static class stringStruct extends Structure {
        public static class ByReference extends stringStruct implements Structure.ByReference {
        }
        public static class ByValue extends stringStruct implements Structure.ByValue {
        }
        public String string;
        
        private int stringSize;
        
        public int getStringSize() {
            return stringSize;
        }

        public void setStringSize(int stringSize) {
            this.stringSize = stringSize;
        }
    }

但这不是 JNA 的工作方式,不是吗?因此,我可以假设我使用的 sonarQube 标准有问题吗?而不是我的实施。

标签: javasonarqubejna

解决方案


JNA 依赖于public结构的类字段的修饰符,这些字段通过反射访问。

通常不使用访问器方法,除非为了方便,例如,如果您有一个byte[]char[]字段打算作为文本,您可能会添加一个getFooString()访问器方法以使获取该字符串更容易。

所以,是的,您必须忽略和/或禁止对这些发出声纳警告,因为它们通常不合规。一般来说,JNA 映射也倾向于保留字段名称的大小写,Sonar 也抱怨这违反了标准!这并不是 Sonar 中的缺陷——这些通常是其他代码的好规则。这不是 JNA 的工作方式。

我尝试将所有 JNA 代码放在自己的包中,原因如下:

  • 它可以更轻松地从某些 CI 工具(如 Sonar)中排除包
  • 迁移到 Java 模块系统 (JPMS) 时,您需要open使用带有 JNA 结构的包,com.sun.jna以便 Structure 类通过反射看到它们。
  • 它使您以后可以更轻松地浏览您的代码并找到可以为 JNA 项目中的用户映射做出贡献并回馈社区的东西!

推荐阅读