在 JMX ObjectName 元素中,不再使用雙斜線

此規則會標示在 javax.management.ObjectName 建構子的網域組件中,可能使用雙斜線 "//" 的情況。 JSR 255 計劃在 javax.management.ObjectName 的網域組件中,利用 "//",作為「重疊顯示」的分隔字元。 雖然 JSR 255 不屬於 Java SE 6,但還是建議 ObjectName 的網域組件不要包含 "//" 字串,以免將來發生相容性問題。

ObjectName 的形式如下:

domain:key1=value1,key2=value2,key3=value3,*

它包含可變數目的索引鍵內容。

如果應用程式包含 MBean,且其 ObjectName 有包含雙斜線的網域名稱,您就需要變更這些 MBean 的網域名稱。

此規則會檢查 ObjectName 建構子,可能的話,還會檢查字串的網域組件,以驗證沒有包含雙斜線。 它可以掃描傳遞字串文字或相同編譯單元中所定義之 final 字串變數的建構子。 如果它可以檢查網域名稱,只會標示違反規則的建構子。

另外,此規則還會標示網域名稱撰寫為變數而未準備好接受檢查的 ObjectName 建構子實例。 請手動檢查這些實例,以驗證網域名稱不包含雙斜線。

範例 1:

public MyClass {
import javax.management.ObjectName;

ObjectName myObj1 = ObjectName("domain//Name:key1=value1,*");
ObjectName myObj2 = ObjectName("domaiName", "key1", "value1");
Hashtable<String,String> myHashTable = new Hashtable<String,String>();
table.put("key1", "value1");
ObjectName myObj3 = ObjectName("domain//Name", myHashTable");
}

在範例 1 中,規則會標示 myObj1 和 myObj3,因為這些字串包含 "//"。 不會標示 myObj2。

範例 2:

public MyClass {
import javax.management.ObjectName;

final String myDomainName = "domainName";
ObjectName myObj1 = ObjectName(myDomainName, "key1", "value1");

final String myObjectName = "domain//Name:key1=value1";
ObjectName myObj2 = ObjectName(myObjectName);
}

在範例 2 中,規則會標示 myObj2,但不標示 myObj1。

範例 3:

public MyClass {
import javax.management.ObjectName;

private ObjectName getMyObjectName(String myObjectName){
ObjectName myObj = ObjectName(myObjectName);
}
}

在範例 3 中,會標示 myObj,因為程式碼無法判斷網域名稱。

如需相關資訊,請參閱: