0

У меня есть адаптация, целью которой является преобразование вызова аргумента переменной в заданный целевой объект. Пример кода показан ниже.Адаптировать переменные аргумента в Java к фиксированному аргументу в Java

class Adapter { 

    public Object execute(Object... args){ 
     run(args); 
     //run2(args[0], args[1]); 
     //run3(args[0], args[1]); 
    } 


    private int run(int c, int d){ 
     return c+d; 
    } 
    private int run(int a, float b){ 
     return 0; 
    } 

    private String run(Integer a, String b){ 
     return "ss"; 
    } 
    private Object run(Object c, float m, int q){ 
     return new Object(); 
    } 
    .......... 
} 

Метод выполнить() принимает переменную аргументы. Основываясь на элементе в args, адаптер выберет одну из runX с согласованным методом на исполнение. Например, run1 будет выбран, если первые два элемента в args оба являются int. Правило соответствия является:

args:{1,2} => run(int, int) 
args:{new Integer(3), "asdas"} => run(Integer, String) 
args:{new Object(), 4.0, 5}  => run(Object, float, int) 
....... 

Есть хороший способ сделать это преобразование вызова в методе выполнения? В Java переменная args и Array идентичны. Невозможно выполнить итерацию каждого элемента в args, чтобы найти совпадающий метод запустите из-за слишком большого пространства комбинаций.


Требование приходит к API, который принимает переменный аргумент, говоря:

 Object execute(Object... args) 

Тогда я представил некоторые оптимизированные версии реализации для многих указанного рода случаев, когда классы элементов в аргументах.

+0

но как бы он знал, какой метод вы хотите? – ergonaut

+0

Это похоже на ужасный дизайн. Почему ты так делаешь? –

+0

Если вам нужны именованные параметры, переключитесь на цель C или передайте хэш-карту. Перегрузка, как вы хотите, требует неприятностей. – ergonaut

ответ

0

Самый простой подход - перебрать все методы run с использованием отражения и искать точное соответствие типов параметров.

Если вам также необходимо поддерживать близкие совпадения, где применяется принуждение Java или какое-либо расширенное преобразование, то это немного сложнее, но все же выполнимо.

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

 Смежные вопросы

  • Нет связанных вопросов^_^