带有常量的Java最终类

带有常量的Java最终类,java,class,oop,static,final,Java,Class,Oop,Static,Final,我必须定义一个类,它所做的只是保存常量 public static final String CODE1 = "100"; public static final String CODE2 = "200"; 现在我想在其他类中使用这些值。将该类用作静态类还是实例化它更好 谢谢 注意:我知道枚举,但在此上下文中,我必须使用一个类。为了使用这些值,您当然不应该实例化该类。仅仅因为可以像访问实例成员一样访问静态成员并不意味着这是一个好主意 如果类实际上只包含常量——如果您确信这是一个好主意,而不是出

我必须定义一个类,它所做的只是保存常量

public static final String CODE1 = "100";
public static final String CODE2 = "200";
现在我想在其他类中使用这些值。将该类用作静态类还是实例化它更好

谢谢


注意:我知道枚举,但在此上下文中,我必须使用一个类。

为了使用这些值,您当然不应该实例化该类。仅仅因为可以像访问实例成员一样访问静态成员并不意味着这是一个好主意

如果类实际上只包含常量——如果您确信这是一个好主意,而不是出现在与它们直接相关的类中的常量——那么您应该使它成为一个带有私有构造函数的
final
类,这样就没有人可以无意义地实例化它:

public final class Codes {
    public static final String CODE1 = "100";
    public static final String CODE2 = "200";

    // Prevent instantiation
    private Codes() {
    }
}

Don’s Response建议使用枚举也是一个非常好的主意-这意味着您可以在API中的任何地方使用
code
,而不需要精确的字符串表示,这可以防止您意外地使用非代码值。

Jons的回答是正确的,尽管我想向您展示一个使用枚举的解决方案。 访问其字符串值有一个缺点,因为您必须调用
code.CODE1.text()
,而不是
code.CODE1

public enum Code {

    CODE1("100"), CODE2("200");

    private String text;

    Codes(String text) {
        this.text = text;
    }

    public String text() {
        return text;
    }
}

java语言规范和JVM规范允许您做任何您想做的事情,无论是实例化一个类还是使用final或其他方式

只需使用Eclipse并尝试


虽然有一些好的实践,但Jon Skeet的答案是一个好的实践

Java语言不支持全局变量

public class ComonFun {
    public static final String CODE1 = "100";
    public static final String CODE2 = "200";

    public static String CODE1(){
        return CODE1;
    }
    public static String CODE2(){
        return CODE2;
    }
}
实施

public class Main {

    public static void main(String[] args) {
        System.out.println(ComonFun.CODE1());
        System.out.println(ComonFun.CODE2());
    }
}

我认为您只需要声明一个接口,不需要指定“publicstaticfinal”子句。它可以通过hall项目使用。

将它们作为静态使用,不要进行实例化

甚至可以使用静态导入作为一种优势

package coma;

import static coma.ImportStatments.*;

public class UsingClass {
    public static void main(String[] args) {
        System.out.println(CODE1);
    }
}
带有最终变量的类如下所示:

package coma; 
public class ImportStatments {  
    public static final String CODE1 = "100";   
    public static final String CODE2 = "200"; 
}

由于字段是静态的,因此没有理由实例化类。你能解释一下为什么枚举也是类而不是解决方案吗?如果你使用静态值,实例化类不会给你带来好处,我们可以使用反射来实例化它吗?@Kartic:只能调用
setAccessible
或其他什么。。。它不会造成任何伤害,只是不打算建造。如果有人想滥用反射,而他们正在一个允许他们这样做的安全管理器中运行,那么对此没有什么可做的。@Kartic
在构造函数中抛出新的UnsupportedOperationException()
也会阻止反射的实例化。@Dragan Bozanovic耶!我同意。我将其称为
code
而不是
code
,这样您就可以在API中使用它,只需一个
code
。。。可能会将属性重命名为
getText()
或类似名称,但这是一件小事:)我想坚持你的答案,因此我使用了
code
,甚至没有考虑命名。但你是对的,我会重新命名它。我还考虑重写
toString()
以返回
code
,但我不想失去返回枚举名称的优势。就我个人而言,我不喜欢枚举的
getX()
方法,因此我将使用
text()
。Don,当您更新代码时,请检查您在回答中是否在其他地方使用了该代码,并修复这些位置。请检查我的编辑,看看你错过了什么。Java内置函数数学…示例数学。为公共静态字段编写getter的原因是什么?您可以不使用getter访问它们。另外,在方法中使用大写字母时,命名违反了约定。