"visibility" 在 Java 文献中的含义不明确?
Meaning of "visibility" ambiguous in Java literature?
首先,了解一下背景。根据我的理解,有两个相关但不同的概念:
1. 辅助功能。这涉及使用 public
、protected
、private
来控制对 class 成员和 classes 本身的访问。
2. 命名。鉴于一个实体首先是可访问的,这涉及是否需要使用简单名称或完全限定名称(如 myOrg.myPackage.myClass
),并与 import
语句相关联,这允许使用简单名称.
Java 中 "visibility" 的一个定义涉及 #1:
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。
然而,在 JLS 中,"scope" 和 "visibility" 似乎与 #2 有关:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.4.1
The scope is the part of the program text within which the declared
entity can be referred to by a simple name.
A declaration d is said to be visible at point p in a program if the
scope of d includes p, and d is not shadowed by any other declaration
at p.
根据这个定义,即使我的public
classmyClass
中的myMember
被声明为public
,也不会被认为是可见的因为不能用简单的名称来引用它(必须使用 myOrg.myPackage.myClass.myMember
)。
我对术语 "visibility" 的这两种用法的解释正确吗?它们具有不同的语义并且使用含糊不清?我无法协调它们。
Oracle Java 教程似乎是 "live documents",没有明显的版本编号。一般来说,它们应该被理解为描述 Java 的 "current" 版本;即最新规范描述的版本。因此,您应该将教程与 Java 10 版本的 Java 语言规范 (JLS) 进行比较。
如@Radiodef 所述,您已链接到 Java 8 JLS。在 Java 9 及更高版本中,术语 "visibility" 不再用于讨论声明的作用域和隐藏。术语 "visibility" 现在用于两种情况:
- 当谈到哪些包和 类 从不同的 Java 9+ 模块可见时,
- 在讨论 Java 内存模型上下文中来自不同线程的变量更改的可见性时。
您在 Java 8 JLS 中找到的 "visibility" 用法不再适用。 (是的,术语发生了变化。)
第二件要认识到的事情是 Java 教程主要是为了让初级和中级 Java 程序员 可以理解 编写的。因此,他们有时会使用未 标准化的术语 ,有时他们会说一些技术上不正确或过于简单的事情。
差异可能是故意的,也可能是疏忽,或者可能只是 "someone" 在更新教程方面落后了。我的理解是不同的人/团体负责规范和教程。当然,编写/编辑这两套文档需要不同的技能,因为(部分)文档针对的是不同的受众。
底线:
如果您想要/需要技术上正确的 Java 术语,请参阅 最新 版本的 JLS 中的定义。
对教程持保留态度。它们不是确定的。
首先,了解一下背景。根据我的理解,有两个相关但不同的概念:
1. 辅助功能。这涉及使用 public
、protected
、private
来控制对 class 成员和 classes 本身的访问。
2. 命名。鉴于一个实体首先是可访问的,这涉及是否需要使用简单名称或完全限定名称(如 myOrg.myPackage.myClass
),并与 import
语句相关联,这允许使用简单名称.
Java 中 "visibility" 的一个定义涉及 #1:
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。
然而,在 JLS 中,"scope" 和 "visibility" 似乎与 #2 有关: https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.4.1
The scope is the part of the program text within which the declared entity can be referred to by a simple name.
A declaration d is said to be visible at point p in a program if the scope of d includes p, and d is not shadowed by any other declaration at p.
根据这个定义,即使我的public
classmyClass
中的myMember
被声明为public
,也不会被认为是可见的因为不能用简单的名称来引用它(必须使用 myOrg.myPackage.myClass.myMember
)。
我对术语 "visibility" 的这两种用法的解释正确吗?它们具有不同的语义并且使用含糊不清?我无法协调它们。
Oracle Java 教程似乎是 "live documents",没有明显的版本编号。一般来说,它们应该被理解为描述 Java 的 "current" 版本;即最新规范描述的版本。因此,您应该将教程与 Java 10 版本的 Java 语言规范 (JLS) 进行比较。
如@Radiodef 所述,您已链接到 Java 8 JLS。在 Java 9 及更高版本中,术语 "visibility" 不再用于讨论声明的作用域和隐藏。术语 "visibility" 现在用于两种情况:
- 当谈到哪些包和 类 从不同的 Java 9+ 模块可见时,
- 在讨论 Java 内存模型上下文中来自不同线程的变量更改的可见性时。
您在 Java 8 JLS 中找到的 "visibility" 用法不再适用。 (是的,术语发生了变化。)
第二件要认识到的事情是 Java 教程主要是为了让初级和中级 Java 程序员 可以理解 编写的。因此,他们有时会使用未 标准化的术语 ,有时他们会说一些技术上不正确或过于简单的事情。
差异可能是故意的,也可能是疏忽,或者可能只是 "someone" 在更新教程方面落后了。我的理解是不同的人/团体负责规范和教程。当然,编写/编辑这两套文档需要不同的技能,因为(部分)文档针对的是不同的受众。
底线:
如果您想要/需要技术上正确的 Java 术语,请参阅 最新 版本的 JLS 中的定义。
对教程持保留态度。它们不是确定的。