在这个代码示例中我应该给一个变量啥修饰符?

Posted

技术标签:

【中文标题】在这个代码示例中我应该给一个变量啥修饰符?【英文标题】:what modifiers should I give a variable in this code example?在这个代码示例中我应该给一个变量什么修饰符? 【发布时间】:2012-07-19 23:44:24 【问题描述】:

在下面的代码示例中,我应该给变量label 提供什么修饰符? 我是 Java 新手,但我想做的第一件事就是分解出我可以在 swing 中使用的所有类,比如 JLabel 并制作它,以便我可以动态调用它们。我希望我在下面做到了。但是,是的,我不确定private static JLabel label;,因为最终我希望能够在某处的主文件中声明所有摇摆类。谢谢。

package base;

import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class CreateLabel extends JLabel 
    private static final long serialVersionUID = 1L;
    private static JLabel label;

    public Component createLabel(JFrame frame, String text) 
        label = new JLabel(text);
        return frame.getContentPane().add(label);
    

【问题讨论】:

如果您打算从另一个类初始化它,那么只公开和静态就可以了。您可以使用 setter 方法,但它相当没有意义。 为什么CreateLabel 扩展JLabel?看起来您将继承与 Builder 模式混淆了 我的第一个问题是为什么?你为什么要扩展 JLabel 来做到这一点?你打算创建一个工厂类吗?那么你会希望 createlabel 不扩展任何东西,是最终的,并且 createLabel 方法是静态的。理想情况下,您也永远不会引用它... 为什么createLabel需要存储在CreateLabellabel中? 忽略@tommo 的评论。除了常量之外,我在这里看不到任何应该是静态的。 【参考方案1】:

我的理解是,你希望你的createLabel() 方法添加一个JLabel 来传递JFrame。你可以做的是:

public class LabelCreator /*extends JLabel*/ 
    /*private static final long serialVersionUID = 1L;*/
    /*private static JLabel label;*/

    public Component createLabel(JFrame frame, String text) 
        JLabel label = new JLabel(text);
        return frame/*.getContentPane()*/.add(label);
    

注意更改类名以尊重命名约定。

【讨论】:

谢谢你,这也很好。你为什么说将类名从 CreateLabel 更改为 LabelCreator 呢?谢谢。 @JoJo:因为类名应该是名词。方法应该是动词。另外,如果有效,您应该接受答案。 我也不确定您为什么要将框架传递给 create 方法。这意味着标签总是被添加到内容窗格的中心,这几乎不是您真正想要的。 @JohnGardner:因为OP的方法就是这样。 @JoJo,是的。您正在混合几件事:控件的创建及其布局。我想你会想要在任何框架中放置多个控件...

以上是关于在这个代码示例中我应该给一个变量啥修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

对于C语言啥时候应该使用volatile修饰符

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

Vue.js 鼠标事件处理程序修饰符