2

最近我发现了一个声明:

import static java.lang.System.out;
import static java.lang.System.exit;

我在一些教程中阅读了这些陈述。这些陈述可以吗?

如果这些语句没问题,它们是什么意思?在编写代码时是否应该经常使用它们?

4

6 回答 6

4

它们被称为静态导入。其效果是允许您在程序中使用名称outexit,就好像它们是在当前范围内定义的一样;所以你可以写exit(0)而不是System.exit(0).

现在,他们是个好主意吗?有时,当谨慎使用时,它们是减少混乱的好方法。但大多数时候,它们实际上只是让你的代码更难理解。读者会问“这是在哪里out定义的?” 和“exit()从哪里来?” 一般来说,你应该避免它们。

但是,如果您正在编写一个完全关于处理SomeReallyLongName对象的类,并SomeReallyLongName定义了一堆 . FINAL_CONSTANTS,使用静态导入导入它们将节省大量输入和大量混乱,并且很清楚这些常量的来源。

于 2011-09-14T16:56:33.900 回答
3

它们是静态导入。它允许您执行类似的操作,exit(0)而不是System.exit(0).

我不建议对众所周知的 Java 类使用此方法,因为它可能会使某些人感到困惑。但有时它对像Guava这样的实用程序类很有用。

Iterables.filter(list, SomeClass.class)

非常冗长,但您可以使用静态导入使其更易于阅读:filter(list, SomeClass.class)

您应该与您的团队核实,以了解他们的代码指南是什么,并尽量保持一致。

于 2011-09-14T16:58:08.670 回答
1

是的,完全没问题。

这被称为static import。这允许在类中定义的成员作为staticpublic使用,而无需指定定义字段的类。此功能在 中定义J2SE 5.0。例如 :

import static java.lang.Math.*;
import static java.lang.System.out; 
// in main
out.print( max(100,200) ); // prints 200.You didn't have to use Math.max(.,.) 

我认为使用静态导入可能不是一个好主意,因为它会使您的代码难以阅读。

于 2011-09-14T16:56:56.493 回答
1

是的,这些陈述被称为static imports并且完全有效。查看有关静态导入的 javase 指南以获取更多信息。

关于使用,该指南指出:

那么什么时候应该使用静态导入呢?非常节俭!仅当您想要声明常量的本地副本或滥用继承(常量接口反模式)时才使用它。换句话说,当您需要频繁访问一个或两个类的静态成员时使用它。如果你过度使用静态导入特性,它会使你的程序不可读和不可维护,你导入的所有静态成员都会污染它的命名空间。您的代码的读者(包括您,在您编写代码几个月后)将不知道静态成员来自哪个类。从一个类中导入所有的静态成员对可读性尤其有害;如果您只需要一两个成员,请单独导入它们。使用得当,静态导入可以让你的程序更具可读性,

于 2011-09-14T17:03:34.653 回答
0

静态导入是 Java 1.5 中添加的新功能

静态导入构造允许对静态成员的非限定访问,而无需从包含静态成员的类型继承。相反,程序单独导入成员

如果您想轻松访问out并且exit可以直接调用它们,那么您的示例没有任何问题out.println()。尽管有些人可能会认为它“令人困惑”并且很难弄清楚它的out来源,但任何现代 IDE 都可以帮助他们弄清楚这一点,但它在语法上和风格方面都没有任何不正确的地方。

于 2011-09-14T16:58:32.513 回答
0

这些是静态导入概念。这些类似于简单的导入,但具有不同类型的概念。请参见此处,您导入了一个函数exit()和一个字段out,并且它们在相应的类中都是静态的(如果这里的 Systen 都是它们的类)。在此之后而不是写System.out.println()你可以简单地写out.println() 。类似地而不是System.exit(),你可以写exit()

于 2011-09-14T17:06:30.543 回答