使用静态导入字段是一个好的编程实践吗?

7

我在我的SQLiteOpenHelper类中声明了一些常量变量:

public static final String USERNAME = "user_name";
public static final String PASSWORD = "password";

在一个创建SQL查询的Activity中,我导入了以下字段:

import com.mygame.ui.login.LoginInfoSQLiteOpenHelper.*;

这是一种好的实践吗?
还是传统的常量引用方式更好?

LoginInfoSQLiteOpen.USERNAME
3个回答

11

如果你看到某人的代码并且发现一个类似于

foo.do(baz, USERNAME); 

这个变量是从哪里来的?搜索、grep一下,它被声明在哪里了?

使用ClassName.FIELD可以使事情更加清晰简洁。这样可以避免混淆,有时候用一个恰当的类名来表示字段比使用一个突然出现的字段更加合理。


不是每个人都使用集成开发环境(IDE),也不是每个人都通过IDE阅读代码(也许是通过网络上的存储库),甚至有些人认为VIM是一种IDE,虽然我经常使用vim(虽然我不认为它是一种IDE)。 因此,重点不在于IDE能做什么或不能做什么,而在于代码阅读。代码阅读、代码质量、用你选择的编程语言以一种通过抽象化的方式表达想法,在合理良好地组合的抽象之间建立联系。


你的IDE不显示USERNAME是什么以及它来自哪里吗?;-) [总的来说,我喜欢这个答案。] - user166390
1
顺便提一下,使用 import package.* 通常被认为是不好的做法。最好用明确的 import package.SomeClass 语句来替换它。 - Cameron Skinner
1
我赞同这个观点,这完全是一个代码阅读问题,与任何性能问题都没有关系,正如一些人所认为的那样。 - c00kiemon5ter
1
虽然我总体上同意,但我有一个例外,即在JUnit测试中使用assertXX()。这仅是因为它们使用的特定上下文。 - Robin
@Ivan c00kiemon5ter V Kanak:感谢你们的建议。这为我解决了疑虑。知道正确和良好的编程方法总是有益的,这使我们的代码更加清晰易读。 - linisax
在我看来,除非你需要大量不同的静态导入,否则每次都要写完整的类和/或包名会降低代码的可读性。 - Yuri Ghensev

4
有些晚了……不过我认为提供相反的观点是值得的。Java设计具有静态字段导入的原因是为了隐藏类的实现方式,这是对外部代码的重要设计原则。我同意c00kiemon5ter的看法,但在某些情况下可能是值得的。
更多关于静态字段导入的信息可以在这里找到:https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

3

我建议采用第二种方法,只导入类而不是字段。因此,将您的常量前缀与拥有它们的类一起使用,例如LoginInfoSQLiteOpen.USERNAME。虽然可能会变得高度冗余,但从长远来看,这样更易读和可维护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接