我是Java和编程的新手,所以请原谅我这是一个愚蠢的问题。
我想创建一个执行此操作的方法exceptionchecker
public void exceptionchecker(Object check){
if(check.size() == 0 && some_other_stuff) throw new IllegalArgumentException();
}
问题是传递的对象可能是列表或字符串。因此,根据具体情况,我需要使用.length
或.size()
。
有没有简单的方法可以做到这一点,还是我最好创建两个单独的方法?
编辑:如果它是相关的,列表也将是String类型。
答案 0 :(得分:2)
您可以使用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 :(得分:1)
您可以使用check.class()来测试对象是字符串还是列表并进行转换, 但更优雅的方法是为每种类型实现异常检查 你需要
void exceptionChecker( String check ) {
...
}
void exceptionChecker( List check ) {
...
}
void exceptionChecker( Object check ) {
...
}
答案 2 :(得分:1)
不要传递Object,而是考虑在相关类型(String,List,Map等)上传递包装器对象;例如ExceptionData,它遵守实现isEmpty
方法的合同。此异常数据将具有在需要时覆盖isEmpty
方法的子类。
当然,这可能会导致创建更多的类以及在运行时创建的一些对象,但除非您正在处理一百万个此类实体,否则这似乎是一种更清晰/明确的方法。
如果这种冗长程度不可接受,请考虑使用方法重载来进行出价,从而产生更清晰的客户端代码,而不会产生额外的对象。
答案 3 :(得分:0)
我建议只使用类似Guava及其Preconditions类的内容来执行此类操作。使用静态导入,您可以执行以下操作:
checkArgument(something.size() > 0 || someOtherStuff);
在那里放置任何支票都很容易。换句话说,只需使用一个带有boolean
参数的方法,并在方法之外进行实际检查。
答案 4 :(得分:0)
如果在编译时知道对象的类型,则有两个签名。在运行时,您可以使用instanceof来确定类型。
if (check instanceof Foo) {
Foo foo = (Foo) check;
if (foo.bar() == something) { ... }
}
答案 5 :(得分:0)
您可能需要首先检查对象是否属于您的方法可以使用instanceof
运算符处理的类型。