3

我有一个疑问,我有一个类,我在其中使用不同的静态导入来导入常量,我的问题是我收到错误消息:Too many static imports may lead to messy code. 但在单元测试中,看起来这不是一个坏习惯。例如在一个单元测试类中,我使用这个导入有任何问题:

import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_FIND_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_LIST_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_REGISTER_ALL_PATH;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.times;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;```

相反,在我的课堂上:

import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
import static org.springframework.http.HttpStatus.NOT_FOUND;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;

这些导入给我带来了麻烦,我收到错误消息:太多静态导入可能导致代码混乱。我不太清楚为什么。

我无法访问 pmd 文件来找出这个问题的真正原因。有什么线索吗?

谢谢!

4

6 回答 6

5

我已经使用 @SuppressWarnings("PMD.TooManyStaticImports") 在我的课堂上避免这个问题。

于 2019-10-05T00:04:43.367 回答
2

这似乎是一个令人反感的 PMD 配置或规则;特别是在测试中,这种静态导入是意料之中的。应该更改 PMD 设置以完全禁用此检查或不将其应用于测试代码。

于 2019-10-04T19:07:41.610 回答
2

首先,PMD 没有抱怨您的测试课程的最可能原因是它根本没有扫描您的测试课程。如果您使用的是 maven pmd 插件,则可以将其配置为includeTests. 查看文档

    <plugin>
        <artifactId>maven-pmd-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
            </execution>
       </executions>
       <configuration>
           <rulesets>
               <ruleset>/my-custom-rules.xml</ruleset>  // Your own rules here
           </rulesets>
           <includeTests>true</includeTests> // Default value is false
       </configuration>
    </plugin>

关于TooManyStaticImports规则,就像任何其他 PMD 规则一样,它可能是主观的,它不一定适合所有用例或代码样式。这就是为什么它说“可能导致混乱的代码”。有支持和反对它的使用的论据。

一般来说,如果你想为一个类静音规则,你可以使用:

@SuppressWarnings("PMD.TooManyStaticImports")

或者,如果您想微调规则,您可以提供自己的自定义配置,例如:

<rule ref="category/java/codestyle.xml/TooManyStaticImports">
    <properties>
        <property name="maximumStaticImports" value="6" /> // Default is 4
    </properties>
</rule>
于 2020-10-12T11:42:45.170 回答
0

虽然这不是问题的答案,但它确实让我想知道 PMD 是否可以有一个注释,允许用户覆盖一个或多个源文件甚至包中的规则配置?唯一的问题是这会引入编译时依赖。如果在包级别引入是否值得?这种易怒商有什么规律吗?得墨忒耳法则浮现在脑海。

至于问题本身,当您实际导入整个类时,使用星形导入进行静态导入。它不那么冗长,也不那么丑陋。

于 2019-11-19T14:41:07.000 回答
0

您可以尝试导入上一级。
例如,使用Constant.MY_VAR而不是直接使用MY_VAR。因此,您不必在 Constant 中单独导入每个变量,只需导入 Constant 并在代码中使用Constant.MY_VAR.

于 2021-06-23T13:08:41.990 回答
0

对我来说,显式具体地导入所有静态文件仍然更好,因为它加载速度比导入所有 (*) 更快,其中一个原因是我们更喜欢 Java 中的显式内容。

因此,我建议禁用此PMD 规则检查。

干杯。

于 2020-08-26T07:16:36.683 回答