Возврат объекта в зависимости от значения в общем виде - PullRequest
0 голосов
/ 31 мая 2018

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

public class A
{
  ...
}

public class AA extends A
{
  ...
}

public class AB extends A
{
  ...
}

public class AC extends A
{
  ...
}

А затем в какой-то другой части кода я хотел бы вернуть один издочерний класс, в зависимости от значения, отправленного этой функции, следующим образом:

public A getChild(int value, Object foo)
{
    switch(value)
    {
        case 0: {
            return new AA(foo);
        }
        case 1: {
            return new AB(foo);
        }
        case 2: {
            return new AC(foo);
        }
        default: {
          return new AA(foo);
        }
    }
}

В этом примере у меня есть только 3 типа детей.Но я мог бы, скажем, 30 из них, и оператор switch стал бы огромным.

Есть ли способ сделать то же самое, используя что-то еще, чем оператор switch, и это было бы более общим?Как указатели на функции в C?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В java есть похожая концепция указателей на функции в C. Вы можете использовать Java Reflection (но не так эффективно):

public A getChild(String className, Object foo)
{
   Class c = Class.forName(className);
   return (A) c.newInstance(Object foo);
}

И вы можете использовать карту, чтобы сохранить ассоциации между "int value "и" String className ".Но это решение неэффективно!Вместо этого вы можете использовать карту функций, предложенную Эраном.

0 голосов
/ 31 мая 2018

Вы можете использовать отображение целочисленных значений в функциональные интерфейсы, которые создают экземпляры различных подклассов A:

Map<Integer,Function<Object,A>> map = new HashMap<>();
map.put(0,f -> new AA(f));
map.put(1,f -> new AB(f));
...

Затем используйте отображение следующим образом:

public A getChild(int value, Object foo) {
    return map.getOrDefault(value, f -> new AA(f)).apply(foo);
}
...