[英]How to refactor constants to enums in Eclipse?
如何使用eclipse將Java常量重構為枚舉?
我發現eclipse中沒有內置功能: http : //help.eclipse.org/juno/index.jsp?topic =%2Forg.eclipse.jdt.doc.user%2Freference%2Fref - menu - refactor.htm
我找到了一個插件: http : //code.google.com/p/constants-to-enum-eclipse-plugin/ 。 我想知道插件是否可行,或者是否有人使用更好的方法。
我總是可以自己創建一個enum類來剪切和粘貼常量,這在2012年是乏味的。請不要指向另一個IDE,我太老太改變壞習慣;-)
以下是執行此重構的一組自動和手動步驟。
步驟1在常量上封裝字段
步驟2(可選)重命名常量。 如果要重用名稱,請執行此操作。
步驟3(手動)使用常量的值創建枚舉。 為枚舉提供一個返回常量的getValue方法。
步驟4(手動)使用枚舉中的getValue替換getter中的返回值。
步驟5內聯吸氣劑。 選擇“所有參考”和“刪除方法聲明”。
第6步內聯常量。 選擇“所有參考”和“刪除常量聲明”。
如果你願意,可以在6之后停止,但要使用枚舉的功能還有很多工作要做。
步驟7對於使用enum.getValue()作為參數的每個方法,替換使用枚舉傳遞的常量。
步驟7a更改方法簽名以將Enum添加為參數。
步驟7b(手動)將enum實例作為新參數傳遞給getValue調用。 確保找到所有實例,否則以后會出現問題。
步驟7c(手動)在該方法中,使用新的枚舉參數而不是常量。 如果您在步驟7b中錯過了呼叫,則此處的測試將失敗。
步驟7d更改方法簽名以刪除舊的常量。
步驟8(手動)對於布爾邏輯中enum.getValue()的每次使用,確定是否可以使用枚舉。
步驟9如果不再使用getValue方法,則可以將其刪除。
步驟9a(手動)刪除未使用的getValue方法
步驟9b(手動)刪除構造函數中的字段和賦值。
步驟9c更改方法簽名以從枚舉構造函數中刪除值。
步驟9d(手動)如果沒有其他參數,刪除枚舉構造函數。
例如:
public class Initial {
public static final String CONSTANT1 = "value1";
public static final String CONSTANT2 = "value2";
public void method(String aConstant)
{
if(aConstant.equals(CONSTANT2))
{
//do something
}
}
public void anotherMethod()
{
method(CONSTANT1);
}
}
步驟1
private static final String CONSTANT1 = "value1";
private static final String CONSTANT2 = "value2";
public void method(String aConstant)
{
if(aConstant.equals(getConstant2()))
{
//do something
}
}
public void anotherMethod()
{
method(getConstant1());
}
public static String getConstant1() {
return CONSTANT1;
}
public static String getConstant2() {
return CONSTANT2;
}
第2步重命名常量
private static final String _CONSTANT1 = "value1";
private static final String _CONSTANT2 = "value2";
...
public static String getConstant1() {
return _CONSTANT1;
}
public static String getConstant2() {
return _CONSTANT2;
}
步驟3創建枚舉
public static enum AnEnum {
CONSTANT1(_CONSTANT1), CONSTANT2(_CONSTANT2);
private final String value;
AnEnum(String aValue)
{
value = aValue;
}
public String getValue()
{
return value;
}
}
步驟4替換Constant getters中的返回值
public static String getConstant1() {
return AnEnum.CONSTANT1.getValue();
}
public static String getConstant2() {
return AnEnum.CONSTANT2.getValue();
}
步驟5內聯常量getter
public void method(String aConstant)
{
if(aConstant.equals(AnEnum.CONSTANT2.getValue()))
{
//do something
}
}
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue());
}
第6步內聯常量
public static enum AnEnum {
CONSTANT1("value1"), CONSTANT2("value2");
步驟7a更改方法簽名以添加枚舉作為參數。
public void method(String aConstant, AnEnum theEnum)
....
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue(), null);
}
步驟7b將enum實例作為新參數傳遞給getValue調用
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1);
}
步驟7c使用新的枚舉參數而不是舊的傳遞值。
if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue()))
{
步驟7d更改方法簽名以刪除舊的常量
public void method(AnEnum theEnum)
....
public void anotherMethod()
{
method(AnEnum.CONSTANT1);
}
步驟8對於布爾邏輯中enum.getValue()的每次使用,確定是否可以使用枚舉。
if(theEnum.equals(AnEnum.CONSTANT2))
{
//do something
}
步驟9a刪除未使用的getValue方法步驟9b(手動)刪除構造函數中的字段和賦值。 步驟9c更改方法簽名以從枚舉構造函數中刪除值。 步驟9d(手動)如果沒有其他參數,刪除枚舉構造函數。
public static enum AnEnum {
CONSTANT1, CONSTANT2;
}
所以最后代碼看起來像這樣:
public class Step9d {
public static enum AnEnum {
CONSTANT1, CONSTANT2;
}
public void method(AnEnum theEnum)
{
if(theEnum.equals(AnEnum.CONSTANT2))
{
//do something
}
}
public void anotherMethod()
{
method(AnEnum.CONSTANT1);
}
}
重構永遠不會改變“外部行為”!
例如:
public enum Test {
NAME1("abc");
Test(String name) {}
public static final String _NAME1="abc";
public static void main(String[] args) {
String k = Test._NAME1;
String m = Test.NAME1;
}
}
如果將_NAME1
重構為NAME1
(枚舉),則代碼會在m
實例化時崩潰。 重構永遠不會成功!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.