为什么不鼓励间接访问静态成员?

keu*_*leJ 20 java eclipse

为什么不鼓励间接访问静态成员?在Eclipse中,您可以在首选项> Java>编译器>错误/警告>"间接访问静态成员"下启用/禁用此警告.

"间接访问静态成员"配置为导致警告时的示例:

JLabel label = new JLabel();
label.setAlignmentX(JLabel.CENTER_ALIGNMENT);       // causes warning    
label.setAlignmentX(Component.CENTER_ALIGNMENT);    // is ok
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 19

通过访问Component该类的成员JLabel给出了一个错误的印象,即该成员是特定的JLabel,实际上它是其Component成员,并恰好被其所有子类继承.Nothig通过宣布课程来访问它,并且肯定会有一些清晰的东西.

  • 您无法覆盖类成员.你可以*隐藏*它们,这将是一个无可争议的坏习惯.请注意,有问题的API明确指出您调用的方法接受`Component`类中定义的常量. (2认同)

Ant*_*ala 8

除了Marko Topolnik所说的,还有一个事实是,如果JLabel将来有一个同名的静态成员,那么仅仅重新编译JLabel.java就不会使调用代码意识到该模块中存在的常量.相反,直到重新编译代码,Component.CENTER_ALIGNMENT尽管源代码相反,它仍然会愉快地使用它.

后一个引用肯定会Component通过名称引用静态成员CENTER_ALIGNMENT,而前者将引用Component任一子类或任何子类中的成员,JLabel如果稍后在其中任何一个中重新定义名称.

在使用静态函数或成员变量的情况下,如果子类的更高版本也声明了重写,则即使不重新编译,间接访问的含义也会改变.所有这些可能都有点假设,但无论如何都要考虑好.