【发布时间】:2022-09-23 20:45:29
【问题描述】:
用例如下,我有一个通用类如下:
public class Test<T> implements Serializable {
private T testObject;
.....
}
使用 sonarLint 抱怨字段 testObject 应该是瞬态的或可序列化的。
如果我要进行如下要求/建议的更改:
public class Test<T extends Serializable> implements Serializable {
private T testObject;
.....
}
虽然如果我想使用这个 Generic Test 类,那么我不能将它与接口类型一起使用,例如 List 接口,因为 List 当然不是可序列化的。
这不会编译,但在我看来,这是对接口进行编程的首选方式。
public Test<List<String>> doSomething() {
}
这可以编译,但实际上不是我想要的......
public Test<ArrayList<String>> doSomething() {
}
所以,不确定我的问题的答案是什么......我应该忽略 SonarLint 警告还是有不同的方法来解决/绕过这个?
-
\"
ArrayList<List<String>> doSomething()\" 这和你的Test班级有什么关系?你的意思是Test<ArrayList<String>>? -
\“有没有不同的方法来解决/绕过这个?\”这在很大程度上取决于你想要做什么/\“通用程度”你真的需要它(比如,你需要它来处理任何 T ,或者是否有一些您需要的 Ts)。
-
您可能应该找到一种不同的方法来解决您的序列化需求,但是如果您坚持使用 java 的序列化机制(它有各种各样的问题),那么接下来最好的事情就是充分理解它的许多细微差别。了解它们后,您还可以弄清楚该警告的含义,进行相应调整,然后然后忽略警告。
-
关于 Sonar 的警告需要指出的一件事:我很确定它不会警告您
Test<ArrayList<NonSerializableThing>>不可序列化 - 部分原因是,如果列表为空,它将是可序列化的或为空。因此,警告所传达的安全印象有点误导。
标签: java