Java—这是一种很好的编程实践吗?

Java—这是一种很好的编程实践吗?,java,coding-style,constants,Java,Coding Style,Constants,只是想知道下面的内容是否被认为是良好的编程实践?我喜欢让我的个人源文件尽可能简洁和整洁,但我想知道更有经验的程序员会怎么想。我特别喜欢Settings.java类将我所有的“神奇数字”保存在一个地方的想法。有没有人建议我如何改进 快乐编码:-) 使用带有幻数的特殊类作为静态成员是一种很好的Java实践 随着程序的发展,可以使用多个设置类,每个设置类都有描述性的名称。Macker很好地介绍了它。此外,这样做将允许您在将来轻松地将一些设置移动到实际用户首选项中,以便他们可以自定义程序的不同部分。由于

只是想知道下面的内容是否被认为是良好的编程实践?我喜欢让我的个人源文件尽可能简洁和整洁,但我想知道更有经验的程序员会怎么想。我特别喜欢Settings.java类将我所有的“神奇数字”保存在一个地方的想法。有没有人建议我如何改进

快乐编码:-)


使用带有幻数的特殊类作为静态成员是一种很好的Java实践


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

Macker很好地介绍了它。此外,这样做将允许您在将来轻松地将一些设置移动到实际用户首选项中,以便他们可以自定义程序的不同部分。由于您的所有设置都已被隔离到各自的类中,因此您只需付出最小的努力。

设置类没有什么错;但是,在您的示例中,这些设置在应用于哪个帧方面比较模糊,也不是实际设置,而是严格属于SwingApplication类的默认值

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


对我来说,对于一个永远不会返回(除非框架关闭)并且只初始化一个对象的构造函数来说,这是毫无意义的。

有些人喜欢将所有这些东西、神奇的数字等进行分组。。。在一个大而丑陋的XML文件中,它将在运行时被读取(并理解)。你的方法显然适合小项目(例如普通课程作业)但是,考虑一下从XML文件获取这些设置的明显优势:您不需要重新编译源代码来反映对设置所做的更改:)

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

您使用的是一些人称之为“可怕的常量接口反模式”,尽管这些常量通常位于导入的接口中。我对它没有任何问题,特别是自从静态导入的出现以来,但是也许有人会告诉我们可怕的邪恶。其中之一似乎是“这不是接口的用途”

更值得关注的是,您应该在线程中启动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);
            }
        });

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


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

如果您要对您的幻数使用静态,请确保它们也是最终的,如果您希望它们不会更改的话。

您可能需要查看JSR 296()用于处理GUI设置/启动/属性。

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

正如其他人所说,这是一个非常好的做法,但您可以做一些事情来改进代码:

  • 给出
    设置
    a类私有无参数构造函数。这使得实例化变得不可能,并使其作为常量存储库的意图更加清晰
  • 设置应该是
    final
    (不可变)以及
    static
  • 通常,Java中的常量是像这样写的
    ,而不是像这样写的
  • 如果您使用的是Java 1.5或更高版本,则可以使用
    import static Settings.FRAME\u WIDTH可以直接使用
    帧宽度
    ,而不必编写
    设置。帧宽度
这最终会让你:

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

    static final int FRAME_WIDTH = 100;

    static final int FRAME_HEIGHT = 200;
}

您可以通过将代码缩进四个空格来格式化代码。通过选择代码并按ctrl-k键,可以自动执行此操作。干杯,谢谢。我仍然习惯于这个网站的工作方式。以后我会记住你说的话,小心点!如果它们是最终的,编译器将把这些值复制到引用它们的代码中(作为优化)。这意味着如果更改常量的值,则需要重新编译使用这些常量的所有代码!(如果常数在单独的罐子中,这尤其糟糕)小心!如果它们是最终的,编译器将把这些值复制到引用它们的代码中(作为优化)。这意味着如果更改常量的值,则需要重新编译使用这些常量的所有代码!(如果常量在一个单独的罐子里,这尤其糟糕)哇,我不知道这一点,但它解释了我以前归咎于NetBeans的一些事情。我仍然认为,出于理智的考虑,它们应该是最终的。反模式是定义一个接口,然后导入它,而不是像这样将其作为静态类使用。静态导入尤其使导入和接口变得不必要,因为“这不是接口的用途”。
class Settings
{
    /** Do not instantiate! */
    private Settings() {}

    static final int FRAME_WIDTH = 100;

    static final int FRAME_HEIGHT = 200;
}