Java 摆动常数与组件常数

Java 摆动常数与组件常数,java,swing,jlabel,Java,Swing,Jlabel,首选哪一种?为什么 JLabel.RIGHT 或 ?? 编辑 感谢您的及时回复,虽然我的问题得到了回答,但它提出了另一个问题(与我最初的问题直接相关)。如果一个是“首选”,为什么允许另一个呢? JLabel jlabel = new JLabel("JLabel",JLabel.RIGHT); // my preference JLabel jlabel = new JLabel("JLabel",SwingConstants.RIGHT); 两者都有效,但是 SwingConstan

首选哪一种?为什么

JLabel.RIGHT

??

编辑

感谢您的及时回复,虽然我的问题得到了回答,但它提出了另一个问题(与我最初的问题直接相关)。如果一个是“首选”,为什么允许另一个呢?

JLabel jlabel = new JLabel("JLabel",JLabel.RIGHT);  // my preference

JLabel jlabel = new JLabel("JLabel",SwingConstants.RIGHT);
两者都有效,但是

SwingConstants.RIGHT
是首选

原因:

  • RIGHT
    在中声明,并从
    SwingConstants
    继承
  • 如果
    JLabel
    也会声明一个名为
    RIGHT
    的字段,那么它会将该字段从
    SwingConstants
    中隐藏,事情可能会变得疯狂,因为它甚至可能具有不同的类型、可见性和值
一般来说,最好不要从类继承,也不要实现仅用于收集常量的接口

但即使您这样做了,也要始终通过定义它们的类名来引用它们,以避免在使用相同名称将新字段添加到子类时出现意外错误

看看这个例子:

class Main implements SwingConstants {
    public static void main(String[] args) {
        System.out.println(RIGHT); // Prints 4
    }
}
这是:

class Main implements SwingConstants {
    private static final int RIGHT = 3;
    public static void main(String[] args) {
        System.out.println(RIGHT); // Prints 3
    }
}
我们的字段隐藏了
SwingConstants.LEFT
,它甚至是同一类型的
int
(可能是不同的类型)。如果类型相同,并且没有编译时或运行时错误,那么很幸运可以跟踪这些隐藏导致的错误

JLabel.RIGHT
SwingConstants.RIGHT

它们都是等效的,因为实现了接口,继承了该接口定义的所有常量

如果您只想为
SwingConstants
界面保存一行
import
,那么您可以简单地使用
JLabel。对
,所有事情都会很好

另一方面,如果您看到这样的线条:

JLabel label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
如果您不了解API,那么这段代码看起来可能比以下代码更不冗长,更有意义:

JLabel label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);

编辑 […]虽然我的问题得到了回答,但它提出了另一个问题 (与我最初的问题直接相关)。如果一个是“首选”,为什么 允许另一个吗

我想这仅仅是因为当他们(和许多其他组件)首先实现了
SwingConstants
接口时,他们的设计选择很差。这毫无意义。这就是为什么我不太关心这个话题的原因

如果您看到这些,建议您使用
SwingConstants
常量:


JLabel继承自SwingConstants,因此我将使用第一个,它更具体一些,因此在阅读代码时更有意义。(当然,如果您正在操作JLabel)

此外,我不记得在实际代码中遇到第二个,但这不是真正的论点

JLabel label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);