Java中的术语“规范形式”或“规范表示”是什么意思?

2022-08-31 09:54:51

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

这是什么意思,任何人都可以举一些例子/指出我一些链接吗?

编辑:感谢大家的回复。您能告诉我规范表示在 equals() 性能中是如何有用的吗?如 Effective Java 中所述?


答案 1

我相信规范有两个相关的用途:形式和实例。

规范形式意味着可以用多种方式描述或表示特定类型的资源的值,并且其中一种方式被选为首选的规范形式。(这种形式是被封圣的,就像把它写成圣经的书一样,而其他形式则不是。规范形式的一个经典示例是分层文件系统中的路径,其中可以通过多种方式引用单个文件:

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

该文件的规范表示形式的经典定义是最后一个路径。使用本地或相对路径,如果没有上下文信息,就无法全局标识资源。使用绝对路径,您可以识别资源,但无法判断两个路径是否引用同一实体。将两个或多个路径转换为其规范形式后,您可以执行上述所有操作,并确定两个资源是否相同(如果这对应用程序很重要(解决混叠问题)。

请注意,资源的规范形式不是该特定形式本身的质量;对于给定类型,可以有多个可能的规范形式,例如文件路径(例如,在词典上首先是所有可能的绝对路径)。出于特定的应用程序原因,一种形式只是被选为规范形式,或者可能是任意的,以便每个人都说相同的语言。

强制对象进入其规范实例是相同的基本思想,但是它不是确定资源的一个“最佳”表示形式,而是任意选择与规范引用具有相同“内容”的一类实例的一个实例,然后将所有引用转换为等效对象以使用一个规范实例。

这可以用作优化时间和空间的技术。如果应用程序中有多个等效对象的实例,则通过强制将它们全部解析为特定值的单个规范实例,可以消除每个值中除一个之外的所有值,从而节省空间和可能的时间,因为您现在可以将这些值与引用标识 (==) 进行比较,而不是对象等效性 (方法)。equals()

使用规范实例优化性能的一个典型示例是折叠具有相同内容的字符串。调用具有相同字符序列的两个字符串可以保证为该文本返回相同的规范字符串对象。如果您通过该规范化程序传递所有字符串,则您知道等效字符串实际上是相同的对象引用,即别名String.intern()

Java 5.0+ 中的枚举类型强制特定枚举值的所有实例在 VM 中使用相同的规范实例,即使该值已序列化和反序列化也是如此。这就是为什么你可以在java中使用,如果是枚举类型,则可以不受惩罚。为您自己的课程执行此操作当然是可能的,但要小心。阅读Josh Bloch的《Effective Java》,了解详细信息和建议。if (day == Days.SUNDAY)Days


答案 2

维基百科指向术语规范化

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

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

Unicode 标准中的可变长度编码(尤其是 UTF-8)对大多数常见字符具有多种可能的编码。这使得字符串验证更加复杂,因为必须考虑每个字符串字符的每个可能的编码。不考虑所有字符编码的软件实现存在接受应用程序设计中被视为无效的字符串的风险,这可能会导致错误或允许攻击。解决方案是允许对每个字符进行一次编码。规范化是将每个字符串字符转换为其单个允许的编码的过程。另一种方法是让软件确定字符串是否被规范化,如果字符串未被规范化,则拒绝它。在这种情况下,在客户端/服务器上下文中,规范化将由客户端负责。

总之,这是数据的标准表示形式。然后,从此表单中,您可以转换为您可能需要的任何表示形式。


推荐