Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какую сигнатуру метода выбрать 
:(
    Опции темы
Royan
  Дата 17.12.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



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


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

Код

public void foo(long[] arr) {
}


и

Код

public void foo(Long[] arr) {
}


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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ivanovpv
Дата 17.12.2009, 21:00 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 4
Всего: 28



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

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


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


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
math64
Дата 18.12.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



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

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
     ...
}


Это сообщение отредактировал(а) math64 - 18.12.2009, 09:01
PM   Вверх
Royan
Дата 18.12.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Маловато мнений для принятия решения не хватает кворума 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
COVD
Дата 18.12.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

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

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

PM MAIL   Вверх
ivg
Дата 19.12.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



К сказанному ещё вариант
Код

    /**
     * 
     * @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");
    }

PM MAIL   Вверх
MaxPayneC
Дата 20.12.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Я бы написал два метода, один из которых вызывает другой
PM   Вверх
Royan
  Дата 21.12.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



ivanovpv
math64
COVD
ivg
MaxPayneC, Вам всем большое спасибо!

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


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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.