Создание метода для нескольких типов объектов в Java - PullRequest
2 голосов
/ 17 февраля 2011

Я довольно новичок в Java и в программировании, поэтому извините, если это глупый вопрос.

Я хочу создать метод exceptionchecker, который делает это

public void exceptionchecker(Object check){
    if(check.size() == 0 && some_other_stuff) throw new IllegalArgumentException();
}

Проблема в том, что передаваемый объект может быть списком или строкой. Поэтому в зависимости от случая мне нужно использовать .length или .size().

Есть ли простой способ сделать это, или мне лучше создать два отдельных метода?

РЕДАКТИРОВАТЬ: Если это уместно, список будет также иметь тип String.

Ответы [ 6 ]

2 голосов
/ 17 февраля 2011

Вы можете использовать instanceof для выполнения некоторых проверок, и это надежно, но это не оставляет его открытым для расширения или ясности.

Причина этого

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

Использование двух методов является наиболее подходящим.

public void exceptionCheck(String s) {
    if(s.length() == 0) throw new IllegalArgumentException();
}

public void exceptionCheck(List<?> l) {
    if(s.isEmpty()) throw new IllegalArgumentException();
}
1 голос
/ 17 февраля 2011

Вместо передачи объекта рассмотрите возможность передачи объекта-обертки над соответствующим типом (String, List, Map и т. Д.); например, ExceptionData, которая выполняет договор о реализации метода isEmpty. Эти данные исключения будут иметь подклассы, которые при необходимости переопределяют метод isEmpty.

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

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

1 голос
/ 17 февраля 2011

Вы можете использовать check.class (), чтобы проверить, является ли объект строкой или списком, и привести его к типу, но более элегантный метод - реализовать проверку исключения для каждого типа, который вам нужен

void exceptionChecker( String check )  {
...
}

void exceptionChecker( List check )  {
...
}

void exceptionChecker( Object check )  {
...
}
0 голосов
/ 17 февраля 2011

Вы можете сначала проверить, относится ли объект к типу, который ваш метод может обработать, используя оператор instanceof.

0 голосов
/ 17 февраля 2011

Наличие двух подписей работает, если вы знаете тип объекта во время компиляции.Во время выполнения вы можете использовать instanceof для определения типа.

if (check instanceof Foo) {
  Foo foo = (Foo) check;
  if (foo.bar() == something) { ... }
}
0 голосов
/ 17 февраля 2011

Я бы порекомендовал использовать что-то вроде Guava и его Предварительные условия класса для таких вещей.Используя статический импорт, вы делаете что-то вроде:

checkArgument(something.size() > 0 || someOtherStuff);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...