当前位置: 代码迷 >> java >> Java EE:与返回辅助类实例的方法的接口。 馊主意?
  详细解决方案

Java EE:与返回辅助类实例的方法的接口。 馊主意?

热度:117   发布时间:2023-07-16 17:53:54.0

我有一个接口,它定义了一个方法,该方法返回一个辅助类的实例,我想知道是否有更好的方法来解决我正在尝试做的事情。

例如,假设我有一个 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)标签。 如果要实现带有标签的对象的不变性,可以将接口更改为具有返回变异实例的with(Tag tag)without(Tag tag)方法。 这将消除对单独的作业类及其相应帮助程序的需要。

  相关解决方案