Каков наилучший способ проверки нескольких instanceof с примитивными типами (например: регистр переключения)? - PullRequest
3 голосов
/ 06 июля 2011

Я искал ответы здесь, и каждая найденная нить была на самом деле «фрагментом» того, что я ищу.

Я бы хотел найти лучший способ, чем этот:

~ РЕДАКТИРОВАТЬ: ОЙ! Прежде всего я хотел использовать примитивные классы Wrapper, но я думал об использовании примитивных типов при вызове метода в тот самый момент ~ Спасибо, что заметили:)

@Override
public void setValue(Object value) {

    if (value instanceof String) {

    } else if (value instanceof Integer) { // and not 'int'

    } else if (value instanceof Long) { // and not 'long'

    }
}

// The usage that made me confused in the first place :
int i = 42;
setValue(i);

Обратите внимание на аннотацию @Override: это реализация метода интерфейса. Этот метод будет принимать разные типы в зависимости от реализации, поэтому я не хочу создавать три отдельных метода, использующих разные типы параметров.

В этом примере это текстовое поле, которое принимает только цифры и ничего больше, поэтому оно может быть представлено только строкой (которая проверяется регулярным выражением ^[0-9]*$), long и int.

Я бы также хотел - возможно, в конечном итоге - принять пользовательские (и простые) DTO, которые больше похожи на POJO, но если эта особенность усложняет все остальное, я имею в виду кое-что еще, так что не волнуйтесь тоже много об этом.

Как я уже сказал, разные реализации этого интерфейса могут принимать совершенно разные типы.

* Я, очевидно, не спрашиваю, как поменять местами целые числа, длинные и строковые значения (которые не могут быть переключены, пока нет. До тех пор, пока не появится Java7), я хочу поменять регистр instanceofs *

После просмотра

Моя реализация, очевидно, работает, но я просто чувствую, что есть лучший способ. Мне интересно, есть ли более чистый метод, чем делать то, что я сделал, что вы предлагаете и почему?

Спасибо за ваше время. С уважением, Доминик Бриссетт.

РЕДАКТИРОВАТЬ: использование с примитивными типами и автобоксом

public static void main(String[] args) {
    int i = 42;

    System.out.println(autoboxing(i));
}

public static boolean autoboxing(Object o) {
    return o instanceof Integer;
}

Выводы true, потому что, в конце концов, myInt instanceof Integer - это правда ..!

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

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

public interface ValueInterface {
    processValue();
}

Тогда метод заданного значения будет выглядеть так:

public void setValue(ValueInterface value) {
   value.processValue();
}

Теперь вы делегируете работу реальному объекту, который знает, как действовать на себя.

2 голосов
/ 06 июля 2011
1 голос
/ 06 июля 2011

Другой способ справиться с этим - написать код для любого типа объекта.

private JLabel label;
@Override
public void setValue(Object value) {
    String text = value.toString();
    Long.parseLong(text); // to validate as a long value.
    label.setText(text);
}

Чистый способ включить тип - использовать перегрузку. Примечание. Объект не может быть примитивным.

public void setValue(String value) {

}

public void setValue(int value) { // shouldn't need this.

}

public void setValue(long value) {

}

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

...