只是想知道以下是否被认为是良好的编程习惯?我喜欢尽可能简洁和整洁地保存我的个人源文件,但我想知道更有经验的编码器会想到它。我特别喜欢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;
}
答案 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
。LIKE_THIS
而不是likeThis
。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”类,并将此类的实例传递给需要参数的类的构造函数。例如,如果要在用户调整窗口大小时保存新大小,则可以保留一个可以轻松保留或修改的配置对象。