Java中的“规范forms”或“规范表示”是什么意思?

我经常听到这个词被使用,但我从来没有真正理解它。

这是什么意思,谁能给一些例子/指向我的一些链接?

编辑:感谢大家的答复。 您是否也可以告诉我规范表示法在equals()性能中是如何有用的,如Effective Java中所述?

维基百科指出规范化这个术语。

将具有多个可能表示的数据转换为“标准”规范表示的过程。 这可以通过比较不同的等价表示法来计算不同数据结构的数量,通过消除重复的计算来提高各种algorithm的效率,或者使得有可能施加有意义的sorting顺序。

Unicode的例子对我来说最有意义:

Unicode标准中的可变长度编码(特别是UTF-8)对于大多数常用字符具有多种可能的编码。 这使得stringvalidation更加复杂,因为必须考虑每个string字符的每个可能的编码。 一个不考虑所有字符编码的软件实现会冒着接受在应用程序devise中被认为是无效的string的风险,这可能会导致错误或允许攻击。 解决scheme是为每个字符允许一个编码。 规范化是将每个string转换为单个允许编码的过程。 另一种方法是让软件确定一个string是否是规范化的,如果不是则拒绝。 在这种情况下,在客户端/服务器上下文中,规范化将是客户端的责任。

总之,数据的一种标准表示forms。 从这个表格中,您可以转换为您可能需要的任何表示。

我相信有两个相关的规范使用:forms和实例。

规范forms意味着特定types资源的价值可以用多种方式来描述或表示,其中一种方式被选为最有利的规范forms。 (这种forms是册封的 ,就像书本成圣经一样,而其他forms则不是)。典型forms的典型例子是分层文件系统中的path,其中可以以多种方式引用单个文件:

myFile.txt # in current working dir ../conf/myFile.txt # relative to the CWD /apps/tomcat/conf/myFile.txt # absolute path using symbolic links /u1/local/apps/tomcat-5.5.1/conf/myFile.txt # absolute path with no symlinks 

该文件的典型表示的经典定义将是最后一个path。 使用本地或相对path,无法在没有上下文信息的情况下全局识别资源。 使用绝对path可以识别资源,但不能分辨两个path是否指向同一个实体。 如果两条或多条path转换为规范forms,则可以执行上述所有操作,并确定两个资源是否相同,如果这对于您的应用程序非常重要(解决别名问题 )。

请注意,资源的规范forms不是该特定forms本身的质量; 对于给定types(如文件path),可能有多种可能的规范forms(比如按字典顺序排列,首先是所有可能的绝对path)。 一种forms被选为特定应用原因的规范forms,或者可以任意地使每个人都说相同的语言。

强制对象进入其规范实例是相同的基本思想,但不是确定资源的一个“最佳”表示,而是任意select具有相同“内容”的实例类的一个实例作为规范引用,然后将所有引用以相当于使用一个规范实例的对象。

这可以用作优化时间和空间的技术。 如果应用程序中存在多个等效对象的实例,那么通过强制将它们全部parsing为特定值的单个规范实例,可以消除每个值的所有值,从而节省空间和时间,因为您现在可以比较这些值与参考标识(==)相对于对象等价( equals()方法)。

使用规范实例优化性能的经典示例是折叠具有相同内容的string。 调用String.intern()在两个string具有相同的字符序列保证返回相同的规范string对象的文本。 如果您将所有string传递给该规范化器,则您知道等价的string实际上是相同的对象引用,即别名

Java 5.0+中的枚举types强制特定枚举值的所有实例在虚拟机内使用相同的规范实例,即使该值是序列化和反序列化的。 这就是为什么你可以使用if (day == Days.SUNDAY)而在java中不受惩罚,如果Days是一个枚举types的话。 这样做对你自己的class级来说当然是可能的,但要小心。 阅读Josh Bloch撰写的“ Effective Java” ,了解详情和build议。

“规范”一词只是“标准”或“通常”的同义词。 它没有任何Java特定的含义。

理解“规范forms/表示”的一个很好的例子是查看“布尔”的XML模式数据types定义:

  • 布尔的“词法表示”可以是{true, false, 1, 0}
  • “规范表示”只能是{true, false}

这实质上就是这个意思

  • "true""1"被映射到规范repr。 "true"
  • "false""0"被映射到规范repr。 "false"

请参阅boolean的w3 XML模式数据types定义

简化为最简单最重要的forms,不失一般性

一个简单的方法来记住它是神学界使用“规范”的方式,规范的真理是真实的事实,所以如果两个人发现它们find了相同的真理。 与规范实例一样。 如果你认为你find了两个(即a.equals(b) ),你真的只有一个(即a == b )。 所以在规范对象的情况下平等意味着身份。

现在进行比较。 您现在可以select使用a==b a.equals(b) ,因为它们将在规范实例的情况下产生相同的答案,但是== b是参考的比较(JVM可以极其比较两个数字因为它们只是两个32位模式,而a.equals(b)是一个方法调用,涉及更多的开销。

另一个很好的例子是:你有一个支持使用笛卡尔(x,y,z),球形(r,theta,phi)和圆柱坐标(r,phi,z)的类。 为了build立平等(等于方法),您可能需要将所有表示转换为您select的一个“规范”表示,例如球面坐标。 (或者也许你会想要这样做一般 – 即使用一个内部表示。)我不是一个专家,但这确实发生在我身上,也许是一个很好的具体的例子。

规范表示意味着查看不同风格的字符,例如,如果我写一个字母A意味着另一个人可能以不同的风格写入字母A 🙂

这是根据光学字符识别字段

规范forms意味着元素的自然唯一表示