繁体   English   中英

静态导入文件或静态导入单个项目

[英]Static Import file or static import individual items

我不确定是对还是错,但是SonarLint会给我关于重复使用某些字符串的无数警告。

结果,我在项目中的每个其他模块中都已经访问过的模块中,纯粹为Strings创建了一个常量文件。

我的想法是,如果我们不断被警告这一点。 它可能会多次创建每个字符串,并暂时增加内存。 (这是一个网络应用程序,使用许多经常重复的术语(例如“身份”或“社区”)生成JSON和XML)

我想知道的问题是,我的IDE(IntelliJ)似乎一直在添加以下行:

import static com.*****.*****.resources.Constants.*

代替:

import static com.*****.*****.resources.Constants.PARAM_NAME_HASEMAIL;
import static com.*****.*****.resources.Constants.PARAM_NAME_HASSMS;
import static com.*****.*****.resources.Constants.PARAM_NAME_CMD;

请记住,当前文件很小,可能有大约100个常数,但该数字最终将达到250个。

首先,我的问题是,哪种导入更有效,只需导入文件,导入每个所需的常量,或者没关系(文件中的max一定是250个常量)

我的第二个问题是,这值得付出努力(轻松但艰巨的工作)吗? 一个例子是:

data.has(PARAM_NAME_OPTIN)
data.remove(PARAM_NAME_OPTIN);
data.put(PARAM_NAME_OPTINTYPE, Coupon.OPTIN_MODE_SINGLE_OPTIN);

上面是在不同文件中的3或4个位置。 这两个常数的定义是:

public static final String PARAM_NAME_OPTIN             = "optin";
public static final String PARAM_NAME_OPTINTYPE         = "optInType";

最严重的罪犯在下面。 在每个单独的方法中,都会从前端调用后端(遵循浏览器中的ajax请求):

json.put(PARAM_NAME_CMD, "Coupon.doSearchCouponEntriesByCoupon");
json.put(PARAM_NAME_APPID, PARAM_NAME_CAMPAIGN);
json.put(PARAM_NAME_COMMUNITYID, session.getAttribute(PARAM_NAME_COMMUNITYID));
json.put(PARAM_NAME_IDENTITYID, session.getAttribute(PARAM_NAME_IDENTITYID));

再次定义为:

public static final String PARAM_NAME_APPID             = "applicationId";
public static final String PARAM_NAME_CMD               = "command";
public static final String PARAM_NAME_CAMPAIGN          = "*****campaign";
public static final String PARAM_NAME_COMMUNITYID       = "communityId";
public static final String PARAM_NAME_IDENTITYID        = "identityId";

我给包装名称加注了星号,以使公司模糊。 即使这并没有真正共享任何IP或机密,安全也要好过抱歉。

感谢您提供的任何反馈(好或坏)。

附加信息:我正在手动为每个使用的文件导入其中一个文件,目前这些常量有22个导入。 我猜如果数字达到这样的高度,那么也许我应该改用*代替? 还是它仍然具有记忆意义?

我的想法是,如果不断有人对此提出警告。 它可能会多次创建每个字符串,并暂时增加内存。 (这是一个网络应用程序,使用许多经常重复的术语(例如“ identityId”或“ communityId”)生成JSON和XML)

这实际上是错误的。 在运行时,所有字符串文字都由类加载器插入。 因此,如果您在许多不同的类中有20个"identityId"示例,则在运行时,您将只有一个String对象,表示文字的所有副本。 (这不是实现细节。JLS保证了这种行为。)

SonarLint警告的真正原因是,具有相同字符串文字的多个副本可能会导致维护问题。 如果要将"identityId"更改为"identityID" ,则可以在20个单独的位置进行更改...并且IDE不会有太多帮助。

首先,我的问题是,哪种导入更有效,只需导入文件,导入每个必需的常量,或者没关系

它对运行时性能的影响为零,并且对编译速度的影响很可能是微不足道的。

不同import样式的最显着影响是对源代码的可读性,这在很大程度上取决于意见。

我的第二个问题是,这值得吗?

在您介绍的示例中,这绝对是一个意见问题。

但是,如果字符串是用户要阅读的消息,则可能需要对其进行国际化。 如果是这种情况,那么最好将字符串存储在(例如)属性文件中,并根据用户的首选语言使用不同的文件。

最后,假设您确实决定使用String常量(这是一个好主意),我不建议将它们全部放入一个大的“ constants”类中。 根据其用途在普通的类和接口中定义它们。

重复使用相同的文字字符串不会产生内存开销,因为Java源代码中的所有文字字符串都是interned的 SonarLint警告您不是因为内存效率低下,而是因为存在错误和降低可读性的风险。

提议的使用整个类的静态导入的解决方案的问题是,当您以后在使用源代码的地方读取常量时,您将不知道这些常量来自何处。 这就是为什么它通常优先于“静态导入”命名字段。 但是,如果您有250个这样的常量,则可能不希望在文件中添加250条静态导入行。

不要将常量命名为PARAM_NAME_APPID等,而是将其放在名为ParamNames的类中。 然后,您可以“静态导入”类名,以便可以看到其来源,并且常量具有不言自明的名称:

static import package.name.ParamNames;
....
xxx = ParamNames.APP_ID;

Constants类重构为属性文件。

然后包含这样的常量

PARAM_NAME_APPID=applicationId

您可以使用加载它

Properties constants = new Properties();
try (FileReader reader = new FileReader("constants.properties")) {
    constants.load(reader);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM