id squid:S2639
- 描述: Regular expressions are powerful but tricky, and even those long used to using them can make mistakes.
- 问题说明:str.replaceAll(".", “ ”);. 第一个参数是正则表达式,配任何单个字符。在replaceAll中使用,它匹配所有内容,所以所有内容都将会被替换
- 解决方案:写入正确的正则表达式,如果要替换所有的字符串,就不需要调用,如果只匹配".",可以使用str.replaceAll("\.", “ ”);
id squid:S2119
-
描述: “Random” objects should be reused
-
问题说明:在意个类的多个方法中使用了Random random = new Random(); 应该重用“随机”对象 随机数种子在创建一个random对象的时候生成,相同 的随机数种子,产生相同随机数的几率非常高
-
解决方案:随机数定义为一个属性,然后在下面的方法里面生成随机值
private Random rand = new SecureRandom(); // SecureRandom is preferred to Random public void doSomethingCommon() { int rValue = this.rand.nextInt(); //...
id squid:S2095
-
描述: Resources should be closed
-
问题说明:连接(Connections)、流(Streams)、文件(files)等实现了Closeable接口的类,在使用以后应该关闭,并且所有的关闭都应该放到finally里面。
-
解决方案:
OutputStream stream = null;
try {
stream = new FileOutputStream(“myfile.txt”);
for (String property : propertyList) {
// …
}
} catch (Exception e) {
// …
} finally {
stream.close();
}
}
try (OutputStream stream = new FileOutputStream(“myfile.txt”)😉{
for (String property : propertyList) {
// …
}
} catch (Exception e) {
// …
}
}
id squid:S2293
-
描述: The diamond operator ("<>") should be used
-
问题说明:Java 7引入了运算符(<>),以减少泛型代码的冗长性。例如,不必在列表的声明和构造函数中声明列表的类型,现在可以使用<>来简化构造函数声明,编译器将推断该类型。
请注意,当项目的sonar.java.source低于7时,此规则将自动禁用
-
解决方案:省略定义变量后面的列表类型
Map<String,List<Integer>> map = new HashMap<>();
id squid:S1186
-
描述: Methods should not be empty
-
问题说明:方法体为空,没有任何实现。方法没有方法体有以下几个原因:
这是一个无意的疏忽导致,应该加以纠正,以防止在生产中出现意外行为。
这个方法还没有或者永远不会实现。在这种情况下,应该抛出 UnsupportedOperationException 。
该方法是一个有意为空的重写。在这种情况下,嵌套注释应该解释空白覆盖的原因。
-
解决方案:添加注释说明或者抛出异常
@Override public void doSomething() { // Do nothing because of X and Y. } @Override public void doSomethingElse() { throw new UnsupportedOperationException(); }
id squid:S1604
-
描述 Anonymous inner classes containing only one method should become lambdas
-
问题说明:在Java8之前,在Java中部分支持闭包的唯一方法是使用匿名内部类。但是匿名类的语法看起来很难理解。
在Java 8中,匿名内部类的大多数使用应该被lambdas替代,以高度提高源代码的可读性。
请注意,当项目的sonar.java.source低于8时,此规则将自动禁用。
-
解决方案:内部类使用lambdas表达式替换
myCollection.stream().map(new Mapper<String,String>() { public String map(String input) { return new StringBuilder(input).reverse().toString(); } }); Predicate<String> isEmpty = new Predicate<String> { boolean test(String myString) { return myString.isEmpty(); } }–>
myCollection.stream().map(input -> new StringBuilder(input).reverse().toString()); Predicate<String> isEmpty = myString -> myString.isEmpty();
id squid:S1118
-
描述 Utility classes should not have public constructors
-
问题说明:实用程序类是静态成员的集合,不应该被实例化。即使可以扩展的抽象实用程序类也不应该有公共构造函数。
Java向每个没有显式定义至少一个类的类添加隐式公共构造函数。因此,至少应该定义一个非公共构造函数。
-
解决方案:向工具类中添加一个非公共的构造函数
class StringUtils { // Compliant private StringUtils() { throw new IllegalStateException("Utility class"); } public static String concatenate(String s1, String s2) { return s1 + s2; } }
id squid:S1948
-
描述 Fields in a “Serializable” class should either be transient or serializable
-
问题说明:字符串判断是否为空的时候,通常是
if (signPdfRequest.getSysFlag() == null 4|| “”.equals(signPdfRequest.getSysFlag())) {
errors.append(“系统标识不能为空;”);
}特别是如果有很多,会导致代码可读性变差
-
解决方案:改为一下写法或者使用注解@Valid
if (StringUtils.isEmpty(signPdfRequest.getSysFlag())) {
errors.append(“系统标识不能为空;”);
}
本文探讨了Java编码中常见的问题及解决方案,包括正则表达式的正确使用、资源关闭的重要性、匿名内部类转换为Lambda表达式、工具类的正确设计以及序列化类字段的处理,旨在提升代码质量和可维护性。

1455

被折叠的 条评论
为什么被折叠?



