> On Apr 19, 2017, at 1:21 PM, Dan Smith <daniel.sm...@oracle.com> wrote:
> 
>> 
>> 5.4.4 Access Control
>> 
>> I don't think you need to restate:
>> 
>> "A class with a MemberOfNest attribute belongs to the nest hosted by the 
>> referenced host class.
>> 
>> A class without a MemberOfNest attribute implicitly belongs to a nest hosted 
>> by the class itself. (If the class also lacks a NestMembers attribute, then 
>> the nest has only one member.)"
>> 
>> The rule is simply stated as is: "belonging to the same nest as D" - 
>> belonging to the same nest is, or should be, already defined elsewhere.
> 
> My intent is that this *is* the definition. But sounds like you're expecting 
> that definition to be in 4.7.25/4.7.26, which is probably more intuitive. 
> I'll change that.

Okay, here's another attempt at defining the attributes and the "nest" concept.

I've been uneasy about `NestMembers` being presented as the "declaration" of 
the nest, since it's not validated. Instead, I see `MemberOfNest` as really 
where nests are defined (as a cumulative result of many class declarations—like 
packages), and `NestMembers` as just a help for validation.

With that in mind, `MemberOfNest` ought to come first:

~~~~

**4.7.25 The `MemberOfNest` Attribute**
---------------------------------------

**The `MemberOfNest` attribute is a fixed-length attribute in the `attributes` 
table of a `ClassFile` structure ([4.1]).**

**A _nest_ is a set of classes and interfaces that share access to their 
`private` members ([5.4.4]).**

**A class or interface with a `MemberOfNest` attribute belongs to the nest 
hosted by a designated _host class_. The host class authorizes membership in 
the nest with a corresponding entry in its `NestMembers` attribute ([4.7.26], 
[4.10]).**

**A class or interface without a `MemberOfNest` attribute belongs to the nest 
hosted by itself. (Often, this nest is a singleton consisting only of the class 
itself.)**

**There may be at most one `MemberOfNest` attribute in the `attributes` table 
of a `ClassFile` structure.**

**The `MemberOfNest` attribute has the following format:**

...


**4.7.26 The `NestMembers` Attribute**
--------------------------------------

**The `NestMembers` attribute is a variable-length attribute in the 
`attributes` table of a `ClassFile` structure ([4.1]). It authorizes an 
enumerated set classes and interfaces to claim membership in a nest hosted by 
the current class or interface.**

**There may be at most one `NestMembers` attribute in the `attributes` table of 
a `ClassFile` structure.**

**The `attributes` table of a `ClassFile` structure must not contain both a 
`MemberOfNest` attribute and a `NestMembers` attribute.**

> **This rule prevents a host class from claiming membership in a different 
> nest. It is implicitly a member of the nest that it hosts.**

**The `NestMembers` attribute has the following format:**

...


5.4.4 Access Control
--------------------

A class or interface _C_ is _accessible_ to a class or interface _D_ if and 
only if either of the following is true:

...

- _R_ is `private` and is declared ~~in _D_~~ **by a class belonging to the 
same nest as _D_ ([4.7.25])**.


~~~~

And now to the bikeshedding game:

`MemberOfNest`, as the key thing, could just be called `Nest` (imagine a 
`Package` attribute—we wouldn't call it `MemberOfPackage`). Or, since it's a 
reference to a class, `NestHost ` / `NestTop` / `NestMother` / `NestWhatever`.

`NestMembers` isn't horrible, but we could highlight its validation role with 
something like `AuthorizedNestMembers`.

—Dan

Reply via email to