问题描述
我有一个接口,它定义了一个方法,该方法返回一个辅助类的实例,我想知道是否有更好的方法来解决我正在尝试做的事情。
例如,假设我有一个 Tag 类:
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 只是定义了一个方法,将 Tag 分配给 TagAssignable,返回一个 TagAssign。
public interface TagAssignableHelper<A extends TagAssignable, T extends TagAssign> {
public T assignTag(A assignable, Tag tag);
}
下面是实现 TagAssignable 的 User 类的样子:
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
我愿意接受所有反馈和建议。
1楼
我认为引入TagAssign
类层次结构会使您的设计复杂化。
我想要实现的是将TagAssignable
接口更改为只有Set<Tag> getTags()
、 add(Tag tag)
和remove(Tag tag)
标签。
如果要实现带有标签的对象的不变性,可以将接口更改为具有返回变异实例的with(Tag tag)
和without(Tag tag)
方法。
这将消除对单独的作业类及其相应帮助程序的需要。