powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм
20 сообщений из 20, страница 1 из 1
Полиморфизм
    #38682212
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть такая структура классов:
Код: java
1.
2.
3.
4.
public class Doc {}
public class Doc1 extends Doc {}
public class Doc2 extends Doc {}
// и т.д. много-много классов



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Service {
    public void action(Doc doc) {
        System.out.println("0");
    }

    public void action(Doc1 doc1) {
        System.out.println("1");
    }

    public void action(Doc2 doc2) {
        System.out.println("2");
    }

    public void realAction(Doc doc) {
        action(doc);
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class PSVM {
    public static void main(String[] args) {
        Service service = new Service();

        // Приходит неизвестный Doc
        Doc doc = new Doc2();

        service.realAction(doc);
    }
}



При вызове service.realAction(doc); соответственно выводится "0". А хочется, чтобы выводилось "2". Как можно поменять код, чтобы в realAction(Doc doc) дергался метод action(Doc2 doc2), а не action(Doc doc). Желательно красиво, без instance of.
...
Рейтинг: 0 / 0
Полиморфизм
    #38682220
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Классы Doc и наследники крайне желательно не менять.
...
Рейтинг: 0 / 0
Полиморфизм
    #38682229
Фотография Zukora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
service.realAction((Doc2) doc); не?
...
Рейтинг: 0 / 0
Полиморфизм
    #38682233
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new Doc2() чисто для примера. Сам объект приходит из вне и неизвестно какого он конкретно типа.
...
Рейтинг: 0 / 0
Полиморфизм
    #38682315
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSVM.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class PSVM {

    public static void main(String[] a) {
        Service service = new Service();
        Doc doc = new Doc2();
        service.realAction(doc);
    }
}

Service.java
Код: java
1.
2.
3.
4.
5.
6.
public class Service {

    public void realAction(Doc doc) {
        doc.polymorphicAction();
    }
}

Doc.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Doc {

    public void polymorphicAction() {
        println("0");
    }
    
    public static void println(String text) {
        System.out.println(text);
    }
}

Doc1.java
Код: java
1.
2.
3.
4.
5.
6.
public class Doc1 extends Doc {

    @Override public void polymorphicAction() {
        println("1");
    }
}

Doc2.java
Код: java
1.
2.
3.
4.
5.
6.
public class Doc2 extends Doc {

    @Override public void polymorphicAction() {
        println("2");
    }
}

...
Рейтинг: 0 / 0
Полиморфизм
    #38682318
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSVM.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class PSVM {

    public static void main(String[] a) {
        Service service = new Service();
        Doc doc = new Doc2();
        service.realAction(doc);
    }
}

Service.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
import java.util.HashMap;

public class Service {

    private static final Action<Doc> DEFAULT_ACTION = doc -> println("0 " + doc);

    private static final HashMap<Class<? extends Doc>, Action<Doc>> ACTIONS = createActionsMap();

    private static HashMap<Class<? extends Doc>, Action<Doc>> createActionsMap() {
        HashMap<Class<? extends Doc>, Action<Doc>> map = new HashMap<>();
        map.put(Doc.class,  DEFAULT_ACTION);

        //<editor-fold defaultstate="collapsed" desc="8">
        map.put(Doc1.class, doc -> println("1 " + doc));
        map.put(Doc2.class, doc -> println("2 " + doc));
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="7">
//        map.put(Doc1.class, new Action<Doc>() {
//            @Override public void make(Doc doc) {
//                println("1 " + doc);
//            }
//        });
//        map.put(Doc2.class, new Action<Doc>() {
//            @Override public void make(Doc doc) {
//                println("2 " + doc);
//            }
//        });
        //</editor-fold>

        return map;
    }

    public void realAction(Doc doc) {
        Action<Doc> action = ACTIONS.get(doc.getClass());
        (action != null ? action : DEFAULT_ACTION).make(doc);
    }

    public static void println(String text) {
        System.out.println(text);
    }
}


Action.java, Doc.java, Doc1.java, Doc2.java
Код: java
1.
2.
3.
public interface Action<S> {
    void make(S on);
}


Код: java
1.
public class Doc {}


Код: java
1.
public class Doc1 extends Doc {}


Код: java
1.
public class Doc2 extends Doc {}

...
Рейтинг: 0 / 0
Полиморфизм
    #38682328
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно visitor вкорячить. В приложении из полутора классов даже будет интересно смотреться.
...
Рейтинг: 0 / 0
Полиморфизм
    #38682352
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IEEE,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public void realAction(Doc doc) throws Exception {
    for (Method m: Service.class.getMethods()) {
        if (m.getName().equalsIgnoreCase("action")) {
            if (m.getParameterTypes()[0].getName().equals(doc.getClass().getName())) {
                m.invoke(this, doc);
                return;
            }
        }
    }
}
...
Рейтинг: 0 / 0
Полиморфизм
    #38682353
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Doc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
...
Рейтинг: 0 / 0
Полиморфизм
    #38682357
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

Тоже вариант)
Когда писал вопрос, думал есть какой-то красивый через полиморфизм какой-нибудь. Остальные варианты будут работать, но на душе не спокойно от них.
...
Рейтинг: 0 / 0
Полиморфизм
    #38684926
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IEEEдумал есть какой-то красивый через полиморфизм какой-нибудь.Чтобы был полиморфизм прийдётся менять код классов Doc.
Но, как вы сами сказали,
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать.Так что, только instanceof и остаётся.
...
Рейтинг: 0 / 0
Полиморфизм
    #38684942
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
У вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?
...
Рейтинг: 0 / 0
Полиморфизм
    #38684957
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllНо, как вы сами сказали,
IEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать.Так что, только instanceof и остаётся.
Ну, можно завести реестр класса на Action. Эдакую свою таблицу виртуальных методов. Но, при всех прочих, полиморфизм самое простое решение.

Другое дело, если Action у нас сложная бизнес транзакция. Тогда проще реализовать что-то вроде
doc.getAction().perform();
Чтобы не добавлять в сущность связей с разными сервисами.
...
Рейтинг: 0 / 0
Полиморфизм
    #38685289
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
BlazkowiczУ вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?Может это не так уж и плохо ?..
...
Рейтинг: 0 / 0
Полиморфизм
    #38685408
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAМожет это не так уж и плохо ?..
Я тоже пока не разобрался был такого же мнения. Если код проще всего держать в сущности. Если код при этом не добавляет в сущности жестких новых зависимостей. То код должен быть в этой сущности. Самый простой критерий - метод сущности должен оперировать только полями и свойствами сущности.
Если вынос кода в Service приходит к необходимости исполь instanceof. Если код усложняется только потому что он находится не в сущности, а в Service, то это явные признаки болезни Anemic Model.

Во-первых это не так просто разбивать методы на код Service и код сущности. Особенно если в этом пока нет необходимости, то и делать никто не будет. Пишешь себе колбасу в Service и не думаешь о том что можно же часть алгоритма в сущность перенести. Тогда код будет проще переиспользовать. Круто, если его переиспользовать не придется. А вот когда придется, тогда мозги и встанут на место. Если только лень и копипаст своё не возьмут.

Во-вторых проблема лишних зависимостей легко решается введением нового абстрактного слоя. Например, какак я предлагал выше - Action.
...
Рейтинг: 0 / 0
Полиморфизм
    #38686316
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
BlazkowiczЯ тоже пока не разобрался был такого же мнения... Я пока не разобрался окончательного, поэтому мнения нет...

Косвенно в пользу anemic model говорит то, что в основных платформах (JEE, Spring) не было реализован DI в сущности. Хотя в JEE7, вроде, появилось, но все же... Как бы все указывает, на то, какая роль отводится для Entity.

Ни в коем случае не хочу разводить холивар. )
Просто прочитал тот блог буквально минут за 15 до прочтения sql.ru. Подумал, возможно будет интересно...
...
Рейтинг: 0 / 0
Полиморфизм
    #38686426
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAКосвенно в пользу anemic model говорит то, что в основных платформах (JEE, Spring) не было реализован DI в сущности.
Вскрывается полное непонимание. Следи за руками. То что Entity не имеет смысла использовать в DI, так как у них относительно короткий жизненый цикл, ещё не значит, что иметь какую-либо логику в Entity это "плохо", как утверждается выше.
...
Рейтинг: 0 / 0
Полиморфизм
    #38686585
IEEE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczIEEEDoc-и - это хибернейтовские сущности(и их много), неохото в них логику пихать. Эх, скорее всего придется instance of-ами или хэшмапом, хотя и не по фэншую это все.
У вас это выльется во все прелести Anemic Domain Model. В чем проблема логики в сущностях?
В этой логике надо дергать другие спринговые сервисы.

Май бэд, наверное, плохо описал задачу. В итоге на каждый

Код: java
1.
2.
3.
public void action(Doc1 doc1) {
        System.out.println("1");
}


был создан отдельный спринговый компонент, унаследованный от generic-интерфейса. А в сервисе, который дергает service.realAction(doc); находится нужный бин и дергается у него action.
...
Рейтинг: 0 / 0
Полиморфизм
    #38686594
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IEEEВ этой логике надо дергать другие спринговые сервисы.

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

IEEEМай бэд, наверное, плохо описал задачу. В итоге на каждый

Не. Всё понятно. На самом деле для Java нет простого однозначного решения.
...
Рейтинг: 0 / 0
Полиморфизм
    #38686948
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
BlazkowiczВскрывается полное непонимание. Следи за руками...Возможно и непонимание... ) Просто мне доводилось видеть проекты, основанные на разных подходах. Когда увижу образчик proper Domain Model и скажу "всегда буду делать так же" - тогда и сменю мнение. Из двух зол приходится выбирать меньшее...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Полиморфизм
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]