Java EE: интерфейс с методом, который возвращает экземпляр вспомогательного класса.Плохая идея? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть интерфейс, который определяет метод, который возвращает экземпляр вспомогательного класса, и мне было интересно, есть ли лучший способ понять, что я пытаюсь сделать.

Например, скажем, у меня есть класс тегов:

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

Я открыт для всех отзывов и предложений.

1 Ответ

0 голосов
/ 21 февраля 2019

Я думаю, что введение иерархии классов TagAssign усложнит ваш дизайн.Чего бы я хотел добиться, так это изменить интерфейс TagAssignable, чтобы в нем были только теги Set<Tag> getTags(), add(Tag tag) и remove(Tag tag).Если вы хотите добиться неизменности объектов с тегами, вы можете изменить интерфейс, чтобы иметь методы with(Tag tag) и without(Tag tag), которые возвращают измененные экземпляры.Это устранит необходимость в отдельных классах присваивания и их соответствующих помощниках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...