Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Какую сигнатуру метода выбрать


Автор: Royan 17.12.2009, 19:17
Задача
Из разных частей приложения входными параметрами являются массив примитивных long[] или массив объектов Long[]


Вопрос
Что правильнее: сделать два метода 

Код

public void foo(long[] arr) {
}


и

Код

public void foo(Long[] arr) {
}


или какой-то один и обязать пользователей самостоятельно конвертить примитивы в объекты или наоборот?

Автор: ivanovpv 17.12.2009, 21:00
Ну исходя из духа Java надо все таки оставить 2 метода..., а может и больше... типа:
Код

public void foo(Integer[] arr) {
}
public void foo(int[] arr) {
}


тоже ведь имеют право на жизнь? Косты на них все равно невысокие, зато красиво и юзеру не надо думать - если он пихнул туда массив целых значений

Автор: math64 18.12.2009, 09:00
Тогда лучше иметь метод общий для всех обёрток чисел:
Код

public void foo(Number[] arr) {
}
public void foo(List<Number> arr) {
}

Но для примитивных типов всё равно нужны будут отдельные методы:
Код

public void foo(int[] arr) {
}
public void foo(long[] arr) {
}

Но возможно лучше так:
Код

inteface IProcess {
   void process(long number);
}
public void forEach(Object array, IProcess iprocess) {
   // Определяем тип массива
   if (array instanceof long[]) {
      for(long number:(long[])array)
        iprocess.process(number);
   } else
     ...
}

Автор: Royan 18.12.2009, 20:25
Маловато мнений для принятия решения не хватает кворума 

Автор: COVD 18.12.2009, 21:20
Цитата

или какой-то один и обязать пользователей самостоятельно конвертить примитивы в объекты или наоборот?

Конвертить массивы не так удобно. Я бы предпочел разные методы. И чтобы имена методов отличались, если их много. Типа foo_Long .. foo_long. Потому, что методы, используемые в разных проектах, иногда удается найти только поиском ( usage не находит).

Автор: ivg 19.12.2009, 08:52
К сказанному ещё вариант
Код

    /**
     * 
     * @param longArray
     * @throws IllegalArgumentException если аргумент метода не является массивом
     * примитивного типа <code>long</code> или объектного типа <code>Long</code>
     */
    public void foo(Object longArray) throws IllegalArgumentException {
        Class<?> clazz = longArray.getClass();
        if (clazz.isArray()) {
            Class<?> elClazz = clazz.getComponentType();
            if (elClazz == Long.class || elClazz == long.class) {
                for (int i = 0; i < Array.getLength(longArray); ++i) {
                    Long element = (Long) Array.get(longArray, i);
                    //TODO: do something with element
                }
                return;
            }
        }
        throw new IllegalArgumentException("аргумент не является массивом" +
            " типа long или Long");
    }

Автор: MaxPayneC 20.12.2009, 22:38
Я бы написал два метода, один из которых вызывает другой

Автор: Royan 21.12.2009, 17:35
ivanovpv
math64
COVD
ivg
MaxPayneC, Вам всем большое спасибо!

Принял решение сделать два метода и назвать их по разному.


PS
Тому кто минус поставил незачот!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)