У меня есть два перечисления, описывающих два 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 Modeling Frameworkвернее, реализация метамодели UML2 в EMF.
В любом случае, я хочу объединить два служебных класса, чтобы избежать избыточного кода.
Я пробовал:
- супер интерфейс для двух профилей
- не работал из-за статических методов
- абстрактный класс для классов Utility
- не работализ-за статических методов
- , инкапсулирующих перечисления профилей в классе
Каждый не работал по той или иной причине.
Любойесть идеи?
РЕДАКТИРОВАТЬ:
Пример для другого служебного метода:
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;
}
РЕДАКТИРОВАТЬ2: И для хорошей меры часть реализации enum профиля
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));
}