Reduce visibility when implementing interface in J

2020-03-13 09:04发布

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?

4条回答
欢心
2楼-- · 2020-03-13 09:08

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

C newC = new A();
查看更多
唯我独甜
3楼-- · 2020-03-13 09:12

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.

查看更多
兄弟一词,经得起流年.
4楼-- · 2020-03-13 09:27

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
    }

}
查看更多
Anthone
5楼-- · 2020-03-13 09:31

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?

查看更多
登录 后发表回答