java - Java EE:与返回帮助类实例的方法的接口。馊主意?
问题描述
我有一个接口,它定义了一个返回帮助类实例的方法,我想知道是否有更好的方法来处理我正在尝试做的事情。
例如,假设我有一个 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
我愿意接受所有反馈和建议。
解决方案
我认为引入TagAssign
类层次结构会使您的设计复杂化。我要尝试实现的是将TagAssignable
界面更改为只有Set<Tag> getTags()
,add(Tag tag)
和remove(Tag tag)
标签。如果要使用标签实现对象的不变性,可以将接口更改为 havewith(Tag tag)
和without(Tag tag)
返回变异实例的方法。这将消除对单独分配类及其相应帮助程序的需要。
推荐阅读
- laravel - 任何曾经在 laravel 中使用 Web Scraping 的人
- html - 如何使用 NodeJS 重定向到另一个页面
- compiler-errors - SwiftUI 初始化程序明显循环
- c - 如何在 C 中连接两个/三个指向 char 的指针并从中打开文件?
- javascript - HTML2Canvas 在 IOS 上给出空白图像
- delphi - 如何在 Firemonkey Delphi 的 TListView 中选择项目后移动到下一个选项卡
- node.js - 如何使用旋转文件流指定旋转文件位置
- java - java NIO SSO 处理器中的空指针
- typescript - 如何通过强制转换缩小打字稿类型,错了?
- git - Merge Request 是否仅指两个不同的 repo?