Re: Protected and package in iterface
On Dec 18, 10:38 am, Lew <l...@lewscanon.com> wrote:
Philipp wrote:
Lew wrote:
Philipp wrote:
Lew wrote in thread "Interface":
Why did the people writing the Java specs decide that an interface
should not contain protected and package methods?
I can imagine several cases where this would be useful.
Perhaps you can describe what such a feature in an interface would
give you that isn't available from the existing mechanisms?
Multiple inheritance inside a package for example. You develop a
package, and internally you want your classes to implement some
interface. But you don't want those methods to be public, just package
visible.
You don't want to let the outside world know about the internal
functioning of your lib/package (there's a public API for that), but
still want to have the power of the interface construct when developping
the lib.
So make the interface itself package-private, or nest it and declare it any
access level you want. Doesn't that do what you need?
--
Lew
While I think that keeps knowledge of the interfaces from the public,
the requirement that methods be public makes it hard to hide those.
E.g., in package 'vehicles' we have interfaces Serviceable and
Warranteeable with methods service and warrantee that should only be
used within the package. The interfaces are declared with package
visibility. We create a public class Car (in vechicles) which
implements these interfaces. If I now create an instance of Car and
use it outside the package, I can't cast it explicitly to Serviceable
or Warranteeable, but I can access the service and warrantee methods.
So to use interfaces I need to break encapsulation. When I tested
this I found even the interfaces are pretty visible. E.g., if I try
System.out.println("Try to access
interface:"+
Class.forName("vehicles.Serviceable").isInstance(car));
to the Tester class below, it runs fine (and prints true). An
explicit use of instanceof will fail in compilation.
Regards,
Tom McGlynn
Code for above:
public class Tester {
public static void main(String[] args) {
Car car = new Car();
car.service();
car.warrantee();
}
}
----
package vehicles;
public class Car implements Serviceable, Warranteeable {
public void service() {
System.out.println("Service called");
}
public void warrantee() {
System.out.println("warrantee called");
}
}
----
package vehicles;
interface Serviceable {
void service();
}
----
package vehicles;
interface Warranteeable {
void warrantee();
}