Swing常量与组件常量

时间:2014-09-03 14:20:07

标签: java swing jlabel

哪个是首选,为什么?

JLabel.RIGHT

SwingConstants.RIGHT



修改

感谢您的快速回复,虽然我的问题得到了解答,但它引发了另一个问题(与我的初始问题直接相关)。如果一个是“首选”,为什么要允许另一个?

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

JLabel jlabel = new JLabel("JLabel",SwingConstants.RIGHT);

3 个答案:

答案 0 :(得分:3)

两者都有效但

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(可能是不同的类型)。当类型相同并且没有编译时间和运行时错误时,祝你好运追踪由这种隐藏引起的错误。

答案 1 :(得分:3)

  

JLabel.RIGHTSwingConstants.RIGHT

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

如果您只想为import界面保存SwingConstants行,那么您只需使用JLabel.RIGHT即可完成任务。

另一方面,如果你看到这样的行:

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

如果您不了解API,那么此代码可能看起来可能比以下更简洁,更有意义:

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

修改

  [p] [...]虽然我的问题得到了回答,但它引发了另一个问题   (与我的初始问题直接相关)。如果一个是“首选”,为什么   允许另一个?

恕我直言,这只是因为当他们JLabel(以及许多其他组件)首先实现SwingConstants接口时,设计选择不佳。这没有任何意义。这就是为什么我在这个话题中不会太在意。

如果您看到the docs,即使那些建议您应该使用SwingConstants常量:

JLabel javadoc

答案 2 :(得分:1)

JLabel继承自SwingConstants,所以我会选择第一个更具体的东西,所以当你阅读代码时更有意义。 (如果你正在操纵JLabel)。

此外,我不记得在实际代码中加入第二个,但这不是一个真正的争论。