簡體   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