[英]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.