2012-11-06 14 views
11

Java sabitlerini tutulmaları olan enumlara nasıl geri koyarım? Sabitlemeleri Eclipse'deki enumlara nasıl geri çekilir?

Tutulma hiçbir yerleşik işlevselliği bulundu: http://code.google.com/p/constants-to-enum-eclipse-plugin/: http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-menu-refactor.htm

Ben bir eklenti buldum. Eklentinin gitmek için bir yol olup olmadığını veya herhangi birinin daha iyi bir yaklaşım kullanıp kullanmadığını merak ediyorum.

Ben her zaman kendimi 2012 yılında sıkıcı sabitleri yapıştırmak & bir kesim Başka bir IDE bana gelin Lütfen bir enum sınıf oluşturabilir, ben değiştirmek çok çok yaşlıyım kötü alışkanlıkları ;-)

+0

+1 Eminim diğer IDE ya bu özelliğe sahip değilim. –

+0

Bu gibi durumlarda bir regex değişimi de hoş bir çözümdür. –

+0

Bu sabitler, sınıf düzeyi veya proje seviyesi var mı? –

cevap

3

İşte bu yeniden işlemeyi yapmak için otomatik ve manuel adımlar kümesidir. sabitleri

Aşama 2 (İsteğe bağlı) üzerine

Aşama 1 Kapsüllemek alan sabitleri yeniden adlandır. İsimleri yeniden kullanmak isterseniz bunu yapın.

Adım 3 (Elle) Enumları sabitlerin değerlerini kullanarak oluşturun. Enum sabitini döndüren getValue yöntemini verin.

Adım 4 (El ile) GetValue ile getçilerdeki dönüş değerini enum'dan değiştirin.

Adım 5 Alıcıları satır içi. "Tüm Referanslar" ı ve "Yöntem bildirimini sil" i seçin.

Adım 6 Sabitleri Inline. "Tüm Referanslar" ı ve "Sabit beyanı sil" i seçin.

İsterseniz 6'dan sonra durabilirsiniz, ancak enemlerin gücünü kullanmak için yapılması gereken daha çok şey vardır.

7. Adım Enum.getValue() yöntemini parametre olarak kullanan her yöntemde, değişkenin yerini enum ile değiştirin.

Adım 7a Yöntem Değiştir Enum parametresi olarak eklemek için İmza.

Adım 7b (Manuel) Enum örneğini getValue çağrısının yanında yeni parametre olarak geçirin. Tüm örnekleri bulacağınızdan emin olun, yoksa daha sonra sorun olur.

Adım 7c (Manuel) Yöntemde, sabit yerine yeni enum parametresini kullanın. Eğer adım 7b'de bir aramayı kaçırdıysanız, testleriniz burada başarısız olur.

Adım 7d Değiştirme Yöntemi Eski Sabiti kaldırmak için imza.

Adım 8 (El ile) Enum.getValue() işlevinin boolean mantığındaki her kullanımı için, bunun yerine enumu kullanıp kullanamayacağınızı belirleyin.

Adım 9 getValue yöntemi artık kullanılmazsa, kaldırılabilir.

Aşama 9a (El) silin kullanılmayan getValue yöntemi

Aşama 9b (El) yapıcıda alan ve atama silin.

Adım 9c Yöntem Değiştir Enum kurucusundan değeri kaldırmak için imza.

Adım 9d (Elle) Başka bir parametre yoksa, Enum yapıcısını kaldırın. Örneğin


:

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); 
} 

} 

Aşama 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; 
} 

Adım 2 yeniden adlandır Sabitler

private static final String _CONSTANT1 = "value1"; 
private static final String _CONSTANT2 = "value2"; 
... 
public static String getConstant1() { 
    return _CONSTANT1; 
} 

public static String getConstant2() { 
    return _CONSTANT2; 
} 

Adım 3

01.235.164 Enum oluşturma
public static enum AnEnum { 
    CONSTANT1(_CONSTANT1), CONSTANT2(_CONSTANT2); 

    private final String value; 

    AnEnum(String aValue) 
    { 
     value = aValue; 
    } 

    public String getValue() 
    { 
     return value; 
    } 
} 

Adım 4

public static String getConstant1() { 
    return AnEnum.CONSTANT1.getValue(); 
} 

public static String getConstant2() { 
    return AnEnum.CONSTANT2.getValue(); 
} 

Adım 5 Tekerlekli sabit alıcılar

public void method(String aConstant) 
{ 
    if(aConstant.equals(AnEnum.CONSTANT2.getValue())) 
    { 
     //do something 
    } 
} 

public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1.getValue()); 
} 

Aşama 6 Tekerlekli sabitleri

public static enum AnEnum { 
    CONSTANT1("value1"), CONSTANT2("value2"); 

Aşama 7A, değiştirme yöntemi Signiture sabit alıcılar

dönüş değeri yerine enum parametresi olarak eklemek. yerine eski geçirilen değerin yeni numaralama parametresi Us 7c

public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1); 
} 

Adım çağrı

public void method(String aConstant, AnEnum theEnum) 
    .... 
    public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1.getValue(), null); 
} 

Adım getValue yanında yeni parametre olarak enum örneğini iletin 7b.

 if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue())) 
    { 

Adım yerine enum kullanabilirsiniz belirlemek boolean mantık enum.getValue() her kullanım için eski sabit

public void method(AnEnum theEnum) 
.... 

public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1); 
} 

Adım 8 kaldırmak için Yöntem İmza değiştirin 7d.

 if(theEnum.equals(AnEnum.CONSTANT2)) 
    { 
     //do something 
    } 

Aşama 9a kullanılmayan getValue yöntemi Aşama 9b (El) silme yapıcıda alan ve atama silin. Adım 9c Enum kurucusundan değeri kaldırmak için Yöntem İmzasını Değiştir. Adım 9d (Manuel) Başka bir parametre yoksa, Enum yapıcısını çıkarın.

public static enum AnEnum { 
    CONSTANT1, CONSTANT2; 
} 

Sonunda kod şuna benzer:

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); 
} 

} 
2

Refactoring asla "dış davranış" değiştirmez! Örneğin

:

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; 
    } 
} 

Eğer _NAME1NAME1 için (enum) planı ayrı, kod m nesnelleştirilmesi üzerine çöker. Refactor asla başarılı olmaz!

+0

Özür dilerim, sanırım, bu nedenle, envanterin yeniden düzenlenmesinin asla tutulmanın bir parçası olmayacağı. –

+0

Yeniden adlandır alanı, yeniden adlandırma yöntemi vb. Her ikisi de bu tür bir çarpışmaya neden olabilir ve Eclipse bunları destekliyor Tamam – artbristol

+0

Bir sınıf özel sabitini bir enum sınıfına çıkarmak isterim (ve potansiyel olarak onu özel yapma). Cevabını takdir ediyorum. – remipod

İlgili konular