[英]Java: Two classes with nearly identical methods using two different enums; possible to avoid redundancy? (static methods everywhere)
我有兩個枚舉描述了兩個 UML 配置文件(意味着它們定義了配置文件包含的原型)。
我還有兩個實用程序類,它們具有在每個配置文件上工作的幾乎相同的方法。
例子:
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 建模框架,或者更確切地說是 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));
}
讓兩個枚舉實現一個通用接口,並在(現在統一的)實用程序 class 中使用這個接口。 或者,更好的是,將方法從實用程序 class 移至接口。
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;
}
}
使用通用接口,如下例所示。
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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.