使用基本类型验证多个instanceof的最佳方法是什么(在:switch case中)?

时间:2011-07-06 13:24:16

标签: java primitive-types instanceof

我在这里搜索了答案,我找到的每一个帖子实际上都是我所寻求的“片段”。

我想找到比这更好的方法:

〜编辑:OOPS!我的意思是首先使用原始的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表示。

我也喜欢它 - 也许,最终 - 接受更像POJO的自定义(和简单)DTO,但如果这个特殊性使其他一切变得复杂,我还有其他的东西,所以不要太担心很多关于这个。

正如我所说,这个界面的不同实现可以接受完全不同的类型。

*我显然没有想要一种方法来切换整数,长整数和字符串(它们不能切换,但直到Java7),我想切换instanceofs *

看了

我的实施显然有效,但我觉得有更好的方法。 我想知道是否有比我做的更干净的方法,你有什么建议和原因?

感谢您的时间。 此致Dominic Brissette。

编辑:使用原始类型和自动装箱

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 个答案:

答案 0 :(得分:4)

您可以做的一件事是将基元包装在一个接口中,这样实现此接口的任何值类型都可以作为值传递。

public interface ValueInterface {
    processValue();
}

然后设定值方法如下:

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

现在,您将工作委托给知道如何对自己采取行动的实际对象。

答案 1 :(得分:2)

尝试Visitor pattern

答案 2 :(得分:1)

处理此问题的另一种方法是为任何类型的对象编写代码。

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) {

}

您很可能不需要单独的intlong方法,因为后者很可能就足够了。