在Java中声明项目常量的正确方法是什么?

6rqinv9w  于 2023-04-10  发布在  Java
关注(0)|答案(3)|浏览(134)

对于Java开发人员来说,这似乎是一个愚蠢的问题,然而,我是Java新手,我的背景是低级c语言。我曾经包括一个头文件,其中包含与我的项目相关的所有常量。(通常是#define的)。我现在正在处理一个大型Java项目,我需要将一些常量设置为全局常量(它们适合多个类,并在项目的各个部分使用)
这让我很难决定把它放在哪里,我应该声明同一个常数几次,在每个类中声明一次吗?
很多框架,使用XML文件来声明框架的常量和定义(Hibernate,Log4J等)在我的项目中使用这种技术是明智的吗?如果是这样,如何才能轻松完成?

ev7lccsx

ev7lccsx1#

和很多事情一样,有很多方法可以做到这一点。有一件事你不应该做,那就是多次声明它们--这太愚蠢了。:P
在Java中,所有的东西都必须在一个类中,所以:
1.选择一个“main”类(假设我有一个名为“FTPServerApp”的项目-我可以将它们放在那里)
1.创建一个“Util”类,包含所有这些
当你想好把它们放在哪里时,用这种方式声明它们:

public static final [type] [NAME_IN_ALL_CAPS] = [value];

这将

  • 使它们可用于所有项目代码,任何地方(public
  • 在类的所有示例中只存在一个值的副本(static
  • 它们不能被改变(final)。

用下划线分隔的ALL_CAPS_FOR_CONSTANT_NAMES是Java中的约定。
所以,如果这是在一个名为FTPServerAPP的类中声明的,并且你有一个名为SERVICE_PORT的常量,它可能是:

public class FTPServerApp {
  public static final int SERVICE_PORT = 21;

  ...
}

。。。你可以从任何类访问它,就像这样。。

FTPServerApp.SERVICE_PORT
nfs0ujit

nfs0ujit2#

看看枚举类型(http://download.oracle.com/javase/tutorial/java/javaOO/enum.html)它们应该提供一种机制来提供常量,而无需定义具体的类(或具有所需常量的接口,这是人们使用的另一种选择)。
我发现另一个有用的技巧(类似于上面给出的FTPServerApp示例)是为任何子系统/组件/等定义一个Context......它不仅保存该系统中组件所需的常量,而且可以保存任何您希望变得更可见或不希望单个组件保持的状态。我相信这是沿着GoF模式之一的路线,但是我已经很久没有看过那本书了,我不能确定(我现在懒得去看它!)

lskq00tm

lskq00tm3#

这是一个很老的问题了。但是我的Ans在jefflunt的Ans之上增加了一些要点。让我们考虑一下你想要一个MyConstant
1.将类设置为final(如果希望扩展它,请忽略)

  • 创建成员变量final static
  • 如果你想把它们作为一个全局常量,把它们标记为public
  • 如果只在包中,您可以将它们标记为protected
  • 将构造函数设置为private。理想情况下,您不希望创建此Constant类的多个示例
  • 编写一个从主类调用的staticinitialize()方法。
public final class MyConstants {
    
    public static final int CONSTANT_ONE = 10;
    private static final Map<String, String> DATA = new HashMap<>();

    public static void initialize() {
        DATA.put("RANDOM", "VALUE");
    }
    public enum color {
        red, blue;
    };

    private MyConstants() {
    }

    public static Map<String, String> getData() {
        return DATA;
    }
}
public class SomeOtherClass {

    public static void main(String args[]) {
        MyConstants.initialize();
        System.out.println(MyConstants.getData());
        System.out.println(MyConstants.CONSTANT_ONE);
    }
}

相关问题