代码之家  ›  专栏  ›  技术社区  ›  Albert

JAVA:投掷属性通用是有意义的吗?

  •  2
  • Albert  · 技术社区  · 15 年前

    当您以某种形式将回调传递给另一个函数时,通常需要填充一些接口才能传递此类回调。这个回调接口通常会限制您可以抛出什么类型的异常。

    对我来说,最自然的方法是被调用函数会自动重新引发(或忽略)回调引发的异常。也就是说,它自动继承可以从回调中抛出的异常列表。也就是说,它可以抛出的异常列表是通用的。

    类似的事情已经可能了吗?如果是这样,为什么javas库还没有使用它呢?

    如果还不可能,为什么不呢?把它包括在语言中并不复杂。它会使一些东西变得更干净(见上文)。


    一个例子:

    我只是偶然发现的 Comparator.compare 无法引发异常(请参见 here 对于相关问题)和 Collections.sort (或其他使用 Comparator )也没有。

    如果例外情况 比较器.compare can-throw是通用的,并且 collections.sort分类 扔的也一样。这可以解决 my problem here 以更自然和干净的方式。

    5 回复  |  直到 15 年前
        1
  •  5
  •   BalusC    15 年前

    我不明白为什么排序对象应该抛出异常的任何合理原因。如果订购是“未指定”的,我只会返回-1,这样它就会到达顶部。

        2
  •  4
  •   Vitalii Fedorenko    15 年前

    我认为通过比较器抛出异常会破坏 single responsibility principle 唯一的工作 compare() 方法是取两个值并返回一个比较结果,而对象的有效性应该在调用程序中提前检查。

        3
  •  0
  •   ColinD    15 年前

    对于每一个实现和每一段使用的代码,这样复杂化API是没有意义的。 Comparator 所以想要抛出已检查异常的边缘案例可以抛出它们,而不是包装在 RuntimeException . 我也认为你在谈论一些主观的事情时犯了一个错误,比如说什么是“自然的”或者“干净的”。我个人认为根本不需要使用它 <Foo, RuntimeException> 作为99.9%的类型签名 比较器 S.

        4
  •  0
  •   Skip Head    15 年前

    我认为事情总是可以安排的,这样compare()就不必抛出异常。

    例如,在上一个问题的情况下,可能会循环访问产生值的数据(并抛出任何异常)。这些值可以存储,稍后在compare()中使用。

        5
  •  0
  •   Albert    15 年前

    还没有人真正给出答案(大多数答案只是针对我的例子,为什么在这种情况下这可能不是一件好事),所以我在这里尝试自己回答:

    不,还不可能。

    最可能的原因是,它不存在是为了保持事情更简单。否则,没有具体原因。

    推荐文章