【问题标题】:Header like Class for defining constants in Java [duplicate]用于在 Java 中定义常量的类标头 [重复]
【发布时间】:2012-06-08 12:44:31
【问题描述】:

可能重复:
How do you define a class of constants in Java?

我想在我的包中定义一个类,只包含常量值,就像在 C 中定义的一样。我是一名学习 Java 的 C 程序员,所以也许这就是为什么我仍然想要一些像类这样的标题:)

为此,这是我的课程:

package com.myclasses
public class defines{

public static byte final ID_1= 0x01;
public static final ID_2= 0x02;

public static String company_name="XYZ";


}

然后在同一个包的另一个类的某个地方,我使用这些定义如下:

byte idval = defines.ID_1;

... and so on.

我的问题是对于这样一个“标题”类,定义它的最佳方式是什么?

它只有静态变量,所以我应该定义类也是静态的吗?

访问修饰符呢?既然里面有定义,我认为它可以“公开”。

请指教。

【问题讨论】:

  • 考虑为您的任务使用enums。
  • @OliCharlesworth:你如何在 Java 中定义一个常量类? 根本不考虑枚举... :( 我的意思是公认的答案。
  • @AlexanderPavlov:好点子。好吧,我敢肯定在 SO...上还有很多关于这个主题的其他问题...
  • 一个关于java常量的好答案是here
  • Effective Java #30:使用枚举代替常量.

标签: java


【解决方案1】:

不要

几乎没有任何常量本身具有价值。它们只有在上下文中才有意义。该上下文是一个真实的类,即具有实例(至少一个)的类。在该类中声明常量。

至于修饰符:尽可能缩小范围:如果仅在声明它们的类中使用,则为私有,如果使用该类的任何人也需要常量,则为公共。

如果您在一个类中声明多个相同类型的常量,请考虑枚举是否更有意义。

是的,常量应该是静态的。

【讨论】:

  • 谢谢詹斯。我应该有任何私有构造函数还是默认会有?
  • 类的用法应该定义它有什么构造函数。如果您实际上只为常量创建一个类(我不建议这样做),请创建一个私有构造函数,这样就不会有人意外地尝试创建一个实例。
【解决方案2】:

这种模式被称为“常量类”模式(我认为)。

使用它的一种方法是将其设为interfaceimplement,然后您就可以“免费”获得参考:

public interface Defines {
    static byte final ID_1= 0x01;
    static final ID_2= 0x02;
    // etc
}

public class MyClass implements Defines {
    byte idval = ID_1; // Note: No need to refer to the class "Defines" here
}

但大多数人认为这是一种反模式,因为它不是真正的接口(它没有方法)。尽管如此,它还是很酷的,并且可能是您轻松进入 java 的好方法。

“标准”方法是定义一个“实用程序类”,它只有静态字段和方法,给它一个私有构造函数以强调您不应该创建其中之一。这就是你所做的 - 继续这样做。

如果您有几个常量是“同一事物”的不同值,例如指南针上的方向等,强烈考虑使用enum。您应该阅读它们。

【讨论】:

  • 当有更好的替代方案(枚举)时,为什么要推荐反模式?
  • @assylias 枚举有它们的位置,但有时你只需要一堆常量。
  • “一堆常量”,你放在一个枚举中。不必实现常量类(诚然这没什么意义),您只需导入常量枚举(使用更短的idval = ID_1.value() 语法的静态导入)。我不太相信在某些情况下常量接口会更好。
  • @assylias 我不太喜欢这个答案,但enum 不一定是更好的选择。考虑interface Constants { String COLOR="Red" ; double SPEED_OF_SOUND=186000 ; long SIZE_OF_STUFF=1323535;} enum 方法要求常量都属于同一类型。
【解决方案3】:

使用最终类

eg : public final class defines {

         // private constructor     
         private defines() {
         }
     }

常量应该定义为

public static final <type> constantName = <value>;

在这种情况下不建议使用枚举,因为当我们的常量之间存在某种关系时,应该使用枚举。

拥有这样的实用程序类是我们在项目中用来定义需要跨项目访问的常量的方法。

如果您只需要特定类中的常量,那么在类本身中定义它们将是最佳解决方案。例如:

private static final <type> constantName = <value>;

【讨论】:

  • 接口是比最终类更好的选择
  • 私有构造函数呢?
  • “最终”定义如何影响班级?为什么不是静态类?
  • 是的,它将有一个私有构造函数。更新答案
  • 类定义的 final 不能被子类化,它会阻止其他程序员子类化一个安全类来调用不安全的方法。我们不希望任何子类更改常量的值。
【解决方案4】:

只需使用 Java 中的接口来定义所有常量..

public interface Const {

String GOVERNMENT = "Government";

String PUBLIC = "Public";

...

}

你也可以使用类。

【讨论】:

  • 这被认为是一种不好的做法,详情请参阅this answer
  • 另外你不需要在接口中使用public static final修饰符
猜你喜欢
  • 2019-02-17
  • 2012-07-02
  • 2012-11-25
  • 2018-11-17
  • 2017-10-01
  • 1970-01-01
  • 2016-10-06
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多