为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2019-09-20 16:32:30
刚收到评论评论我静态导入该方法并不是一个好主意。静态导入是来自DA类的方法,该类主要使用静态方法。因此,在业务逻辑的中间,我有一个似乎属于当前类的da活动:import static some.package.DA.*;class BusinessObject {  void someMethod() {    ....    save(this);  }} 审稿人并不热衷于我改变代码而我没有,但我确实同意他。给出非静态导入的一个原因是,在定义方法的地方很混乱,它不在当前类中而不在任何超类中,所以它也有一段时间来识别它的定义(基于Web的审查系统没有可点击的IDE之类的链接:-)我真的不认为这很重要,静态导入仍然很新,我们很快就会习惯定位它们。但另一个原因,我同意的是,一个不合格的方法调用似乎属于当前对象,不应该跳转上下文。但如果确实属于它,那么扩展超级类是有意义的。所以,当它是有意义的静态导入的方法呢?你什么时候做的?您是否喜欢不合格电话的样子?编辑:流行的观点似乎是静态导入方法,如果没有人会把它们混淆为当前类的方法。例如,java.lang.Math和java.awt.Color中的方法。但是如果abs和getAlpha不模糊,我不明白为什么readEmployee是。在许多编程选择中,我认为这也是个人偏好的事情。感谢您的回复,我正在结束这个问题。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

静态导入的另一个合理用途是使用JUnit 4.在JUnit方法的早期版本中,类似于assertEquals并且fail自测试类扩展以来继承了这些方法junit.framework.TestCase。


// old way

import junit.framework.TestCase;


public class MyTestClass extends TestCase {

    public void myMethodTest() {

        assertEquals("foo", "bar");

    }

}

在JUnit 4中,测试类不再需要扩展TestCase,而是可以使用注释。然后,您可以静态导入断言方法org.junit.Assert:


// new way

import static org.junit.Assert.assertEquals;


public class MyTestClass {

    @Test public void myMethodTest() {

        assertEquals("foo", "bar");

        // instead of

        Assert.assertEquals("foo", "bar");

    }

}

JUnit 文档以这种方式使用它。


查看完整回答
反对 回复 2019-09-20
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

有效的Java,第二版,在第19项末尾指出,如果您发现自己大量使用实用程序类中的常量,则可以使用静态导入。我认为这个原则适用于常量和方法的静态导入。


import static com.example.UtilityClassWithFrequentlyUsedMethods.myMethod;


public class MyClass {

    public void doSomething() {

        int foo= UtilityClassWithFrequentlyUsedMethods.myMethod();

        // can be written less verbosely as

        int bar = myMethod();

    }

}

这有利有弊。它使代码更具可读性,代价是丢失一些关于定义方法的直接信息。但是,一个好的IDE会让你进入定义,所以这不是一个问题。


你仍然应该谨慎使用它,并且只有当你发现你自己使用导入文件中的东西很多次。


编辑:更新为更具体的方法,因为这是这个问题所指的。无论输入什么(常数或方法),该原则都适用。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 341 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信