一尘不染

Java 静态导入方法的一个好用例是什么?

java

刚刚收到评论,我静态导入该方法不是一个好主意。静态导入是DA类中的一种方法,该类主要具有静态方法。因此,在业务逻辑的中间,我有一个da活动,显然似乎属于当前类:

import static some.package.DA.*;
class BusinessObject {
  void someMethod() {
    ....
    save(this);
  }
} 

审阅者并不希望我更改代码,也没有,但是我确实同意他的观点。不能静态导入的原因之一是方法的定义位置令人困惑,它不在当前类中,也不在任何超类中,因此花了太多时间来确定其定义(基于Web的审阅系统没有可点击的像IDE这样的链接:-)我真的不认为这很重要,静态导入仍然很新,很快我们都会习惯于定位它们。

但是,我同意的另一个原因是,不合格的方法调用似乎属于当前对象,并且不应跳转上下文。但是,如果确实存在,则扩展该超类将是有意义的。

所以,当它是有意义的静态导入的方法呢?你什么时候做的?你是否喜欢不合格的电话的外观?

编辑:流行的观点似乎是静态导入方法,如果没有人将它们混淆为当前类的方法。例如,来自java.lang.Math和java.awt.Color的方法。但是,如果abs和getAlpha不明确,我看不出为什么readEmployee是。与许多编程选择一样,我认为这也是个人喜好。

多谢你的回覆,我想解决这个问题。


阅读 302

收藏
2020-03-11

共1个答案

一尘不染

这是从Sun发布该功能时的指南中得出的(原始内容为重点):

那么什么时候应该使用静态导入?非常谨慎!仅当你打算以其他方式声明常量的本地副本或滥用继承(常量接口反模式)时,才使用它。…如果你过度使用静态导入功能,它将使你的程序无法读取和不可维护,并使用你导入的所有静态成员污染其名称空间。代码的读者(包括你,在你编写代码后的几个月内)将不知道静态成员来自哪个类。从类中导入所有静态成员可能对可读性特别有害;如果只需要一个或两个成员,则分别导入它们。

(https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html)

我想特别指出两个部分:

  • 仅当你试图“滥用继承” 时才使用静态导入。在这种情况下,你是否会想拥有BusinessObject extend some.package.DA?如果是这样,静态导入可能是一种更清洁的方式来处理此问题。如果你从未梦想过扩展some.package.DA,那么这可能是对静态导入的不充分使用。键入时不要仅使用它来保存一些字符。
  • 导入个人成员。说import static some.package.DA.save而不是DA.*。这将使查找此导入方法的来源变得容易得多。
    就个人而言,我已经使用这个语言功能非常只能用常量或枚举很少,而且几乎总是,从不与方法。对我来说,这种权衡几乎是不值得的。
2020-03-11