gpt4 book ai didi

java - Java 中的术语 "canonical form"或 "canonical representation"是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 11:44:26 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

规范形式意味着可以以多种方式描述或表示特定类型资源的值,并且选择其中一种方式作为首选规范形式。 (这种形式是规范化的,就像将其纳入圣经的书籍一样,而其他形式则不是。)规范形式的一个典型例子是分层文件系统中的路径,其中单个文件可以以多种方式引用:

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() 可以保证为该文本返回相同的规范 String 对象。如果您通过该规范化器传递所有字符串,您就会知道等效字符串实际上是相同的对象引用,即别名

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

关于java - Java 中的术语 "canonical form"或 "canonical representation"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com