Java - 这是一个很好的编程实践吗?

时间:2009-05-17 20:48:32

标签: java coding-style constants

只是想知道以下是否被认为是良好的编程习惯?我喜欢尽可能简洁和整洁地保存我的个人源文件,但我想知道更有经验的编码器会想到它。我特别喜欢Settings.java类的想法,将我的所有“魔数”保存在一个地方。有没有人对我如何改进事情提出任何建议?

快乐编码: - )

class ApplicationLauncher 
{
    public static void main(String[] args) 
    {
        SwingApplication mySwingApplication = new SwingApplication();
    }
}

//////////////

import javax.swing.*;

public class SwingApplication extends JFrame
{
    public SwingApplication()
    {       
        JFrame myJFrame = new JFrame();
        myJFrame.setSize(Settings.frameWidth, Settings.frameHeight);
        myJFrame.setVisible(true);      
    }
}

//////////////

class Settings 
{
    static int frameWidth = 100;
    static int frameHeight = 200;
}

11 个答案:

答案 0 :(得分:6)

设置类没有任何问题;但是,在您的示例中,设置在它们适用的帧方面相当暧昧,它们不是实际设置,而是严格属于SwingApplication类的默认值。

我们无法控制的另一件事是构造函数如何调用Swing级联到程序的消息泵循环中。

对我来说,永远不会有一个永不返回的构造函数(除非框架被关闭)并且不仅仅是初始化一个对象。

答案 1 :(得分:5)

将具有魔术数字的特殊类作为静态成员是一种很好的Java实践。

随着程序的增长,可以使用多个设置类,每个类都有描述性名称。

答案 2 :(得分:4)

有些人喜欢将所有这些内容,魔术数字等组合在一个大而丑陋的XML文件中,该文件将在运行时被读取(并被理解)。您的方法显然适用于小型项目(例如一般课程),但考虑从XML文件获取这些设置的明显优势:您不需要重新编译源代码以反映对您的设置所做的更改:)< / p>

答案 3 :(得分:4)

你正在使用一些人称之为“可怕的常量接口反模式”,尽管通常常量是在导入的接口中。我没有遇到任何问题,尤其是自静态导入​​问世以来,但也许有人会让我们陷入可怕的祸害。其中一个似乎是“那不是什么接口”。

更值得关注的是,你应该在一个帖子中启动你的GUI:

    //Schedule a job for the event-dispatching thread: creating
    //and showing this application's GUI.
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame myJFrame = new JFrame();
                myJFrame.setSize(Settings.frameWidth, Settings.frameHeight);
                myJFrame.setVisible(true);
            }
        });

答案 4 :(得分:4)

正如其他人所说,这是一个非常好的做法,但是你可以采取一些措施来改进代码:

  • Settings类提供一个私有的无参数构造函数。这使得无法实例化并使其作为常量存储库的意图更加清晰。
  • 设置应为final(不可变)以及static
  • 通常,Java中的常量是LIKE_THIS而不是likeThis
  • 如果您使用的是Java 1.5或更高版本,则可以在课程中使用import static Settings.FRAME_WIDTH;直接使用FRAME_WIDTH,而不必撰写Settings.FRAME_WIDTH

这样就结束了:

class Settings
{
    /** Do not instantiate! */
    private Settings() {}

    static final int FRAME_WIDTH = 100;

    static final int FRAME_HEIGHT = 200;
}

答案 5 :(得分:3)

Macker很好地覆盖了它。此外,通过这种方式,您可以在将来轻松地将某些设置移动到实际的用户首选项中,以便他们可以自定义程序的不同部分。由于您的所有设置已经被隔离到他们自己的类中,因此您需要花费最少的精力。

答案 6 :(得分:2)

我认为只要设置不太可能改变并记录设置之间的关系,这可能是一种很好的做法。如果这些可能会改变,那么配置文件和/或命令行参数更有意义,因为它们不需要重新编译。

答案 7 :(得分:2)

如果你打算使用静态数字作为你的幻数,请确保它们也是最终的,如果你的意思是不要改变它们。

答案 8 :(得分:1)

可变静力学是一个非常糟糕的主意。坚持“从上面参数化”。

直接询问,但示例代码还有其他问题。你已经扩展了JFrame(一个不好的做法),但后来忽略了它并创建了另一个JFrame来实际使用。此外,您还需要包含样板文件以始终访问AWT事件调度线程(EDT)上的Swing组件。

答案 9 :(得分:0)

您可能需要查看JSR 296(Swing Application Framework)来处理您的GUI设置/启动/属性。

答案 10 :(得分:0)

另一个不需要静态导入的解决方案是创建一个包含字段,getter和setter的完整“ApplicationSettings”类,并将此类的实例传递给需要参数的类的构造函数。例如,如果要在用户调整窗口大小时保存新大小,则可以保留一个可以轻松保留或修改的配置对象。