sonarQube 引发 Make a static final constant or non-public 并在需要时在 JNA 结构上提供访问器

sonarQube raises Make a static final constant or non-public and provide accessors if needed on JNA structure

我创建了以下在我的项目上下文中工作的 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 成为静态最终常量或非 public,并在需要时提供访问器。” 这很奇怪,因为我的结构中有两个字段,只有一个字段引发了这样的问题。

无论如何,如果我理解正确,关于这个问题我应该做类似的事情来解决 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 标准有问题吗?而不是我的实现。

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

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

所以是的,您将不得不忽略 and/or 抑制这些声纳警告,因为它们通常是不合规的。一般来说,JNA 映射也倾向于保留字段名称的大小写,Sonar 也抱怨这不符合标准!这并不是 Sonar 中的缺陷——这些通常是您其他代码的良好规则。这不是 JNA 的工作方式。

出于以下几个原因,我尝试将所有 JNA 代码放在自己的包中:

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