10

I would like to design class A implements interface C and reduce the visibility of a method (declared in C)to make it secure from outer world, make one of the methods in interface implemented in class A as private (reducing visibility in class A). I have to do this for security reason, how can I do this, is there a workaround. We do know that by default, the interface has public members. But there is no option for me, can someone help me. Thanks in advance.

-- So , there is no way, to have a class implement method from interface and make it private. And all classes that implement any interface's method will always have public methods?

David Prun
  • 8,203
  • 16
  • 60
  • 86

4 Answers4

16

No, you can't reduce the visibility of a method in an interface. What would you expect to happen if someone wrote:

C foo = new A();
foo.methodDeclaredPrivateInA();

? As far as the compiler is concerned, everything with a reference to an implementation of C has the right to call any methods within it - that's what Liskov's Substitution Principle is all about.

If you don't want to implement the whole of a public interface, don't implement it - or throw exceptions if you absolutely must.

It's also worth noting that the accessibility provided in source code is rarely a good security measure. If your class is running in a VM which in turn gets to determine its own permissions, anyone can make members visible via reflection.

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • So , there is no way, to have a class implement method from interface and make it private. And all classes that implement any interface's method will always have public methods? – David Prun Jul 05 '11 at 19:51
  • @user357349: Yes. That's the way it's designed. – Jon Skeet Jul 05 '11 at 19:56
3

You can't reduce the visibility of the method of an interface in Java. Is it acceptable for you to implement the method by throwing a java.lang.UnsupportedOperationException?

highlycaffeinated
  • 19,729
  • 9
  • 60
  • 91
0

This approach worked for me. Any new function added to PrivateInterface would break still break PublicSampleClass

private interface PrivateInterface {
    void fooBar();
}

public class PublicSampleClass {

    private final listenerInterface = new PrivateInterface {
         public void fooBar() {
            PublicSampleClass.this.fooBar();
         }
    };

    protected void fooBar() {
      // Non public implementation
    }

}
Vairavan
  • 1,246
  • 1
  • 15
  • 19
0

You cannot reduce visiblity because you could write something along the lines of

C newC = new A();
Kal
  • 24,724
  • 7
  • 65
  • 65