2011-05-27 318 views
2

我有兩個枚舉描述兩個UML配置文件(意思是它們定義配置文件包含的原型)。Java:使用兩個不同枚舉的方法幾乎相同的兩個類;可以避免冗餘? (靜態方法無處不在)

我也有兩個實用工具類,在每個配置文件中使用幾乎相同的方法。

實施例:

public static List<Element> getStereotypedElements(final InsertProfileHere stereo, final Package pkg) { 
    List<Element> extendedElements = new ArrayList<Element>();  
    if (isProfileApplied(pkg)) { 
     if (hasStereotype(stereo, pkg)) { 
      extendedElements.add(pkg); 
     } 
     extendedElements.addAll(getStereotypedElements(stereo, pkg.allOwnedElements())); 
    } 
    return extendedElements; 
} 

,其中InsertProfileHere可與每個所述兩個輪廓枚舉來代替。

如果有人對此感興趣,此方法使用Eclipse Modeling Framework或EMF中的UML2元模型實現。

無論如何,我想合併兩個工具類以避免冗餘代碼。

我已經試過:

  • 兩個型材 超級接口
    • 沒有因靜態方法
  • 的實用工具類的抽象類工作
    • 由於靜態方法而不工作
  • 封裝外形的枚舉類

每一個或其他原因沒有工作。

任何人有任何想法?

編輯:

另一個實用方法的一個例子:

public static boolean hasStereotype(
    final InsertProfileHere stereo, final Element elem) { 
    for (Stereotype appliedStereo : elem.getAppliedStereotypes()) { 
     if (stereo == null) { 
      if (InsertProfileHere.contains(appliedStereo)) { 
       return true; 
      } 
     } else if (stereo.isEqual(appliedStereo)) { 
      return true; 
     } 
    } 
    return false; 
} 

EDIT2:而對於輪廓枚舉的落實好措施部分

public enum Profile1 { 

STEREOTYPE1 ("readable stereotype1 name"), 
STEREOTYPE2 ("readable stereotype2 name"), 
STEREOTYPE3 ("readable stereotype3 name"), 

public static final String PROFILE_NAME = "NameOfProfile"; 

private final String readableName; 

private Profile1(final String newName) { 
    readableName = newName; 
} 

public static Profile1 getValue(final String name) { 
    for (Profile1 type : Profile1.values()) { 
     if (type.toString().equals(name)) { 
      return type; 
     } 
    } 
    return null; 
} 

public static boolean contains(Stereotype stereotype) { 
    return (stereotype.getProfile(). 
      getDefinition().getNsURI().contains(PROFILE_NAME)); 
} 
+1

爲什麼兩個枚舉?如果我們從根本上談論類別和子類別,那麼只需將笛卡爾產品打包成一個枚舉類型,或者(更好的是,恕我直言),只需使用「近似重複」代碼......這只是一個(簡短)方法,是的? – corlettk 2011-05-27 08:40:50

+2

當你的Enums實現相同的接口時,什麼都不起作用? – joe776 2011-05-27 08:45:26

+0

@ 1:不完全的,Utility類有幾種方法,我只發佈了一個例子。 – danowar 2011-05-27 09:28:38

回答

1

讓兩個枚舉器一個通用接口,並在(現在統一的)實用程序類中使用此接口。或者,更好的是,將方法從實用程序類移動到界面。

interface Stereotype { 
    public boolean hasStereotype(Package pkg); 
    public List<Element> getStereotypedElementes(Package pkg); 
} 

enum Enum1 implements Stereotype { 

    FOO("com.foo"), BAR("com.bar"); 

    Enum1(String packagename) { 
    this.packagename=packagename; 
    } 

    private String packagename; 

    @Override 
    public boolean hasStereotype(Package pkg) { 
    return pkg.getName().equals(packagename); 
    } 

    @Override 
    public List<Element> getStereotypedElementes(Package pkg) { 
    ... 
    } 

} 

enum Enum2 implements Stereotype { 
    ... 
} 


public class Foo { 
    static List<Element> getStereotypedElements(final Stereotype stereo, final Package pkg) { 
    List<Element> extendedElements = new ArrayList<Element>();  
    if (isProfileApplied(pkg)) { 
     if (stereo.hasStereotype(pkg)) { 
      extendedElements.add(pkg); 
     } 
     extendedElements.addAll(stereo.getStereotypedElements(pkg.allOwnedElements())); 
    } 
    return extendedElements; 
    } 
} 
+0

+1的路要走。 – Boro 2011-05-27 08:54:13

+0

好的,在我看來,我用「UMLProfile」替換了「Stereotype」。 hasStereotype(Package)意味着我可以詢問配置文件枚舉的每個實例是否包含此構造型。如果我想要一個靜態方法hasStereotype,它會檢查Package是否包含任何配置文件原型,這也可以工作嗎? – danowar 2011-05-27 09:55:47

0

使用通用接口,如下例所示。

import java.awt.Color; 

public class EnumeInteraceTest 
{ 
    public interface ICorolsEnum 
    { 
     public Color getColor(); 
    } 
    public enum Colors1 implements ICorolsEnum 
    { 
     MAGENTA(Color.MAGENTA), 
     PINK(Color.PINK); 
     private Color color; 

     private Colors1(Color color) 
     { 
      this.color = color; 
     } 

     @Override 
     public Color getColor() 
     { 
      return color; 
     } 
    } 
    public enum Colors2 implements ICorolsEnum 
    { 
     GREEN(Color.GREEN), 
     BLUE(Color.BLUE); 
     private Color color; 

     private Colors2(Color color) 
     { 
      this.color = color; 
     } 

     @Override 
     public Color getColor() 
     { 
      return color; 
     } 
    } 

    public static void main(String[] args) 
    { 
     ICorolsEnum ice1 = Colors1.MAGENTA; 
     System.out.println(ice1.getColor()); 
     ICorolsEnum ice2 = Colors2.GREEN; 
     System.out.println(ice2.getColor()); 
    } 
} 
相關問題