Reduce visibility when implementing interface in J

2020-03-13 08:26发布

问题:

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?

回答1:

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.



回答2:

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?



回答3:

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

C newC = new A();


回答4:

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
    }

}