在Java中为多个对象类型创建方法

时间:2011-02-17 05:00:25

标签: java string list object size

我是Java和编程的新手,所以请原谅我这是一个愚蠢的问题。

我想创建一个执行此操作的方法exceptionchecker

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

问题是传递的对象可能是列表或字符串。因此,根据具体情况,我需要使用.length.size()

有没有简单的方法可以做到这一点,还是我最好创建两个单独的方法?

编辑:如果它是相关的,列表也将是String类型。

6 个答案:

答案 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运算符处理的类型。