§7.1. Opaque roles
The purpose of the types
IConfined (see
§6.2(a)) is to define
opaque roles: Any role implementing
IConfined
can be externalized using this type, such that external clients
cannot access any features of the role. The type
IConfined
exposes no features and references of this type cannot be widened
to any type not even to
java.lang.Object.
If the actual role type
is furthermore invisible outside the team (by not declaring
it
public), it is perfectly safe to externalize
such roles using type
IConfined
(which is a public interface)
and pass them back to the owning team. The encapsulation
of the team is in no way breached by externalizing opaque roles,
which can only be used as a handle into internal state of the
team.
The difference between the two mentioned interfaces is that
Team.IConfined requires to use this type or any subtype
as externalized role. Such a reference contains the information of
the enclosing team. Even stricter control can be imposed using the
regular interface
IConfined. Here not even team membership
is visible to clients using a reference of this type.
§7.2. Confined roles
Subclassing
Team.Confined with a protected class
yields a role class to which no object outside the team will
ever have a reference. The point here is that a role class with
a regular super class will widen the this reference to the
super class when executing a method from this class. Within such
a method a danger of leaking the reference exists.
Subclasses of
Team.Confined do not inherit any methods
that have this danger.