1

我想知道我应该把所有的 CONSTANTS 放在哪里,以便我的 Java 项目中的所有包和类都可以访问它们?我如何将它包含在下面的主要课程中?

我有一个经典的 ASP 背景,很抱歉到目前为止代码中的任何错误。

StickyNotes() 类。

package base;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class StickyNotes extends JFrame {

    private static final long serialVersionUID = 1L;
    private final static String SAVE_CHNGS = "Save changes?";
    private final static String TITLE_AYS = "Are You Sure?";

    private void createStickyNotesGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("Java Sticky Notes");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));

        // Add Main Menu
        MainMenuBar mainMenu = new MainMenuBar();
        frame.setJMenuBar(mainMenu.createMainMenuBar(frame));

        // Add Content Pane // can I pass a layout object?
        frame.setContentPane(ContentPaneCreator.createContentPane());
        // contentPane.add(scrollPane, BorderLayout.CENTER);

        // Add Tool Bar
        ToolBarCreator toolBar = new ToolBarCreator();
        frame.getContentPane().add(toolBar.createToolBar(), BorderLayout.NORTH);

        // Add Label
        frame.getContentPane().add(
                LabelCreator.createLabel(frame,
                        "use Swing and JavaFX together."), BorderLayout.NORTH);

        // Display the window.
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

        // frame.setExtendedState(JFrame.NORMAL);
        frame.setVisible(true);
    }

    public void doExit(JFrame frame) {
        boolean fDirty = true;
        if (fDirty)
            switch (JOptionPane.showConfirmDialog(StickyNotes.this, SAVE_CHNGS,
                    TITLE_AYS, JOptionPane.YES_NO_OPTION)) {
            case JOptionPane.YES_OPTION:
                // if (doSave())
                frame.dispose();
                break;
            case JOptionPane.NO_OPTION:
                frame.dispose();
            }
        else
            frame.dispose();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new StickyNotes().createStickyNotesGUI();
            }
        });
    }
}
4

7 回答 7

5

其他人建议创建一个名为Constants. 我建议你不要那样做。将每个常量保存在与其最相关的位置。在您给出的常量的情况下,这些是可本地化的文本,可能应该在属性文件中开始。

对于“多选项”值,您应该考虑使用枚举。

您可能偶尔会创建一个类来保存一组特定的常量或“有效常量”——例如Charsets在 Guava 中。

但是单个项目范围的常量集?很少有好主意。当然,这并不意味着常量不应该在项目范围内访问public static final——只要值是不可变的,简单地创建字段(或访问器方法)就可以了。(如果它是可变的,则需要仔细考虑线程。)

于 2012-07-21T12:31:49.587 回答
3

不要那样做。真的,不要。将常量放在它们所属的类中。一个常量很少被多个类使用。即使是这样,该常量也与某些特定逻辑相关联,并且应该在实现该逻辑的类中定义。

例如,假设您有一个用于解析日期的默认日期模式。此模式的常量应在DateParser使用此常量的类中定义。

无论如何,将所有常量放在一个类中并不能扩展。如果您的应用程序变大,该类最终将包含数百个名称非常大的常量以避免冲突,并且没有任何范围类定义它的用途。

于 2012-07-21T12:35:21.160 回答
1

您创建一个类并在该类中定义常量并导入它。

于 2012-07-21T12:26:34.233 回答
1

我创建了一个包含所有常量的 CONSTANTS.java 并将其导入到任何地方。Java 中对于包含常量的文件应该命名的内容没有硬性规定。

于 2012-07-21T12:29:23.133 回答
1

在 Java 中,没有特定的类来存储常量。

在某些特定情况下:

  • 如果常量需要被许多不同的类访问
  • 如果在项目期间常量的数量没有机会增长,

    最好创建一个类(例如命名为 Constant)并在此处使用public static final <objectType> <OBJECTNAME>(OBJECTNAME 应为大写)声明所有常量字段。

    然后当你想使用常量时,在类中添加导入:import <your_package_name>.<your_constant_class>并使用常量调用Constant.fieldname(如果你的类的名称是Constant

顺便说一下,在您的示例中,您似乎希望对 Swing 应用程序中的消息执行此操作。对于这种情况,它可能不是最好的解决方案。将常量分别保存在业务类中,便于其他开发人员阅读和理解。如果项目增长(并且常量的数量增加),Constant 类将是一团糟。

如果我真的需要常量被许多不同的类使用,我只使用常量类,并且常量数量增长的机会是有限的。

于 2012-07-21T12:30:18.983 回答
1

制作常量的“史前”惯用方式是将它们包含到接口中,然后继承该接口:

// This is archaic - do not do it like this:
interface MyConstants {
    int A = 5;
}

class MyClass implements MyConstants {
    public static void main(String[] args) {
        // Note that A is referenced by itself, not as MyConstants.A
        System.out.println(A);
    }
}

目前,Java 提供了一种更好的方法来实现相同的效果:在单个类中定义常量,然后静态导入该类。该类将用作将相关常量组合在一起的一种方式:

package com.my.test;
public class MyConstants {
    static final int A = 3;
}

package com.my.other;
import static com.my.test.MyConstants;
   class MyClass {
    public static void main(String[] args) {
        // Note that A is referenced by itself, not as MyConstants.A
        System.out.println(A);
    }
}
于 2012-07-21T12:33:19.620 回答
1

1.使用所有常量(即公共静态最终变量)创建一个单独的类。

2.然后使用这个类的名称“.” (点)访问它的常量名

例如:

常量持有类

public class MyConstant{


  public static final int MAX = 100;
  public static final int MIN = 10;
  public static final String ID = "5U23";



}

从其他类访问常量。

public class Test{

public void go(){

int m = MyConstant.MAX;

}


}

3.如果您不希望将来对常量进行任何更改时触及您的类,请尝试拥有一个保存常量的属性文件

于 2012-07-21T12:33:33.570 回答