Java sonarQube提升使静态final常量或非公共,并在需要时在JNA结构上提供访问器

Java sonarQube提升使静态final常量或非公共,并在需要时在JNA结构上提供访问器,java,sonarqube,jna,Java,Sonarqube,Jna,我创建了以下在我的项目上下文中工作的JNA结构: @FieldOrder({ "string", "stringSize" }) public static class stringStruct extends Structure { public static class ByReference extends stringStruct implements Structure.ByReference {

我创建了以下在我的项目上下文中工作的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标准有问题吗?而不是我的实现。

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

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

因此,是的,您必须忽略和/或抑制这些设备上的声纳警告,因为它们通常是不符合要求的。一般来说,JNA映射也倾向于保留字段名的大小写,Sonar也抱怨这违反了标准!这并不是Sonar中的一个缺陷——这些通常是其他代码的好规则。这不是JNA的工作方式

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

  • 这使得从某些CI工具(如Sonar)中排除包变得更容易
  • 当迁移到Java模块系统(JPMS)时,您需要
    打开
    带有JNA结构的包到
    com.sun.JNA
    ,以便结构类通过反射查看它们
  • 它使您更容易在以后浏览代码,并在JNA项目中找到有助于用户映射的内容,并反馈给社区
除了我的答案之外,我还可以补充一点,即很少需要ByReference或ByValue附加。当用作方法/函数参数时,默认情况下通过引用解释结构,如果嵌套在另一个结构中,默认情况下通过值解释结构。如果不是以默认方式使用结构,则只需添加这些。