【问题标题】:Java "ANSI constants"Java“ANSI 常量”
【发布时间】:2013-10-11 01:40:23
【问题描述】:

我在浏览 Java 代码约定时发现了这个小花絮:

声明为类常量的变量名和 ANSI 常量名应全部大写,单词之间用下划线(“_”)分隔。 (应避免使用 ANSI 常量,以便于调试。)

(来自here。)

本文档所说的这些“ANSI 常量”是什么?以及它们如何使调试变得更加困难?

文本听起来好像“变量声明的类常量”(我将其解释为普通的static final 变量)和这些“ANSI 常量”之间存在二分法,但我不知道有什么方法可以声明Java 中的常量,而不是使它们成为static final 变量。

【问题讨论】:

  • 这是一个有趣的问题。我很好奇你对我的回答的看法。另外,我碰巧在 Oracle 工作,如果您想要更权威的答案,我可以检查是否有任何原作者仍然在这里。

标签: java naming-conventions history


【解决方案1】:

我希望它与静态初始化程序或非编译时间常量有关,但我真的不知道(我在代码约定中搜索该术语,这将我带到这里 :)

public class TestClass
{
  final static Object ANSI_CONSTANT;
  static { ANSI_CONSTANT = new Object(); }
}

【讨论】:

    【解决方案2】:

    这里,ANSI 常量 是指由 ANSI(美国国家标准协会)定义的预定义常量。请参阅此link 了解更多详情。

    ANSI 实际上是一个建立标准的组织,它使我们所有人的生活更轻松。很多事情都建立了 ANSI 标准。 ASCII 是将值映射到字符表示的数字编码,即 65 = A,由 ANSI 标准涵盖。 NaN(不是数字)是可以通过浮点计算返回的值,该值由 ANSI 与 IEEE 一起定义。 ANSI 为很多事情建立了常量,特别是在通信领域,例如 SQL、字符集、颜色(这就是为什么黑色在大多数计算机上的值为 0!)等。因此,如果您定义一个常量来表示定义的常量在 ANSI 标准中,例如 公共静态最终ANSI_BLACK = 0; 您应该遵循这些约定。 (注意 Sun 与 NaN、Color.black 等一样违反了这些约定。)

    我希望这会有所帮助 Carl Trusiak,SCJP2,SCWCD

    在调试时使用这些可能会导致内部冲突,因为可能会错误地引用用户定义的常量或常量的隐含值。

    【讨论】:

      【解决方案3】:

      它们很可能是指 ANSI C 常量,defined as follows

      在 ANSI C 中可以通过两种方式定义常量:通过#define 语句和使用 const 修饰符。例如下面两条语句,是等价的:

      #define LENGTH 10       /* Length of the square in inches */
      
      const int length = 10;  /* Length of the square in inches */
      

      现在 Java 中显然没有 C 常量,因为 Java 不是 C :-)(这不是官方编码约定中最奇怪的部分,但我离题了)。

      那么他们为什么要编写 ANSI 常量呢?这很可能只是引用最终原语和不可变对象的一种方便方式。请记住,在 C 中,const struct 的字段在初始化后无法更新,并且这种“常量”没有对应的 Java 术语(final 不能很好地捕捉到不变性的概念)。

      【讨论】:

      • 感谢您的回答,但这只是猜测;希望得到更权威的答案。另外,对我来说,说有人将“C”称为“ANSI”似乎有点牵强,但谁知道呢。 :)
      • 对。我确实找到了一个older version of the document,它(意外地?)里面有 C 代码(就在 ANSI 常量部分的正上方)。所以我不会说对 C 的延伸是那么 :-) 但我也对此很好奇,我会尝试与作者联系。会更新。
      【解决方案4】:

      互联网上关于什么是 ANSI 常量的唯一参考资料是在阅读过命名约定的人们提出相同问题的论坛中。似乎这个词是由编写文件的人发明的,你必须问他们他们的意思。

      ANSI 是美国的一个国家标准机构,例如以 ASCII 字符集标准和 ANSI C 语言标准而闻名。 ANSI 也是 Microsoft Windows 所称的基于区域 ASCII 的默认字符编码。作者可能指的是字符串文字。

      【讨论】:

      • “作者可能指的是字符串文字。” -- 不太可能。 Java 字符串文字不是 ASCII,它们是 UTF-16。
      猜你喜欢
      • 2011-12-02
      • 2018-01-08
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多