У меня есть интерфейс, который определяет метод, который возвращает экземпляр вспомогательного класса, и мне было интересно, есть ли лучший способ понять, что я пытаюсь сделать.
Например, скажем, у меня есть класс тегов:
public class Tag {
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
Вы можете назначать теги другим объектам.
Назначение представлено TagAssign:
public abstract class TagAssign {
private Tag tag;
public Tag getTag() {
return tag;
}
public void setTag(Tag tag) {
this.tag = tag;
}
}
Новый тип назначения расширит TagAssign и определит, для чего назначается тег.
Например, тегприсвоение пользователю будет выглядеть следующим образом:
public class UserTag extends TagAssign {
private long id;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
Объект, которому может быть присвоен тег, будет реализовывать интерфейс TagAssignable:
public interface TagAssignable {
public TagAssignableHelper getTagAssignableHelper();
}
TagAssignable определяет метод, который возвращаетэкземпляр TagAssignableHelper.
На данный момент TagAssignableHelper просто определяет метод, который присваивает тег TagAssignable, возвращая TagAssign.
public interface TagAssignableHelper<A extends TagAssignable, T extends TagAssign> {
public T assignTag(A assignable, Tag tag);
}
Вот что класс User, который реализует TagAssignable, будетвыглядит так:
public class User implements TagAssignable {
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public UserTagAssignableHelper getTagAssignableHelper() {
return new UserTagAssignableHelper();
}
}
И UserTagAssignableHelper выглядит следующим образом:
public class UserTagAssignableHelper implements TagAssignableHelper<User, UserTag> {
@Override
public UserTag assignTag(User assignable, Tag tag) {
UserTag userTag = new UserTag();
userTag.setUser(assignable);
userTag.setTag(tag);
return userTag;
}
}
Используемый код:
public class Main {
public static void main(String[] args) {
List<TagAssignable> assignables = new ArrayList<>();
assignables.add(new User());
Tag tag = new Tag();
List<TagAssign> assignments = new ArrayList<>();
for (TagAssignable assignable : assignables) {
TagAssign assignment = assignable.getTagAssignableHelper().assignTag(assignable, tag);
assignments.add(assignment);
}
}
}
Я в основном хочу, чтобы каждый тип TagAssignable определял, какон используется внутри фреймворка.Когда разработчик помечает класс как TagAssignable, он должен определить, как создается класс TagAssign, потому что в какой-то момент в фреймворке он попытается сделать именно это.
Я пытаюсь избежать чего-либовот так:
if(assignable instanceof User) {
User user = (User) assignable;
UserTag userTag = new UserTag();
userTag.setTag(tag);
userTag.setUser(user);
return userTag;
}
// followed by more ifs for each type of TagAssignable
Я открыт для всех отзывов и предложений.