java - 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 标准有问题吗?而不是我的实施。
解决方案
JNA 依赖于public
结构的类字段的修饰符,这些字段通过反射访问。
通常不使用访问器方法,除非为了方便,例如,如果您有一个byte[]
或char[]
字段打算作为文本,您可能会添加一个getFooString()
访问器方法以使获取该字符串更容易。
所以,是的,您必须忽略和/或禁止对这些发出声纳警告,因为它们通常不合规。一般来说,JNA 映射也倾向于保留字段名称的大小写,Sonar 也抱怨这违反了标准!这并不是 Sonar 中的缺陷——这些通常是其他代码的好规则。这不是 JNA 的工作方式。
我尝试将所有 JNA 代码放在自己的包中,原因如下:
- 它可以更轻松地从某些 CI 工具(如 Sonar)中排除包
- 迁移到 Java 模块系统 (JPMS) 时,您需要
open
使用带有 JNA 结构的包,com.sun.jna
以便 Structure 类通过反射看到它们。 - 它使您以后可以更轻松地浏览您的代码并找到可以为 JNA 项目中的用户映射做出贡献并回馈社区的东西!
推荐阅读
- java - 当我的代码不使用 ArrayLIst 时,为什么 ArrayList.java 会出现 NullPointerException 错误?
- php - PHP:如何根据数组中的概率获取值?
- plot - Gadfly中横轴的范围
- angular - 我可以将 Angular 8 Web 应用程序转换为 ionic 4 应用程序吗?
- python - 我如何在另一个函数中调用一个函数?
- reactjs - React material-ui KeyboardDatePicker 和 Formik 不起作用
- ios - 为什么 textFieldShouldReturn 委托不能作为@IBAction 拖放?
- api - Flutter中如何通过API发送数据?
- python - 扩展和填充 Pandas DataFrame 以匹配另一个
- c# - 如何应用检查仅选择简单字符串并忽略包含日期的字符串?