如何仅显示java中的接口视图

时间:2011-10-27 21:47:05

标签: java view interface typechecking

是否可以仅显示接口的特定视图或在Java中显示此行为?例如:

public interface SecureDevice
{
   bool connectWith( SecureDevice d ); // visible to people who have a SecureDevice object
   bool connectWith( SecureDevice d, Authentication a ); // somehow only visible to classes with permission
}

我希望SecureDevice接口的用户不知道需要进行身份验证才能进行交互,甚至不存在类身份验证。他们不需要知道细节。他们只需要知道交互发生或不发生。例如,获得两个SecureDevice对象的用户可以尝试这样做:

public void establishConnection(SecureDevice d1, SecureDevice d2 )
{

    Connector c = new Connector();

    if( false == d1.connectWith( d2 ) )
    {
        System.out.println("Couldn't connect to directly");
    }
    else if ( false == c.connect( d1, d2 ) )
    {
        System.out.println("Couldn't connect using Connector.");
    }
 }

但我可能会定义一个这样的类:

public class Computer implements SecureDevice
{
    private Authentication auth;

    public bool connectWith( SecureDevice d )
    {
        return d.connectWith(d, auth);
    }

    private? bool connectWith(SecureDevice d, Authorization a)
    {
        // check the authorization, do whatever it takes to connect, etc.
    }
}

或类似地

public class Connector 
{
    private Authentication myAuth;

    public bool connect(SecureDevice a, SecureDevice b)
    {
        a.connectWith(b, myAuth);
    }

}   

这个例子在C ++中看起来很像朋友,但我觉得它略有不同。我不想特别许可使用方法。

我想将两个接口作为SecureDevice的一部分:

   public interface SecureDevice
   {
       public interface UserView
       {
           connectWith(SecureDevice d);
       }

       public interface LibraryView
       {
           connectwith(SecureDevice d, Authentication a);
       }
    }

如果真的有两个独立的接口,当我想使用另一个接口时,我将不得不在它们之间进行转换,而我无法保证实现一个的对象实际上实现了另一个,所以我会必须做运行时类型检查。

因此,为了简化,我只想向用户提供一个简单的界面,只需要他需要的方法,而不是他不需要的任何业务。我该怎么做(或近似)?

由于

2 个答案:

答案 0 :(得分:1)

没有。如果您必须提供没有身份验证的接口,那么这就是该接口中需要的内容。

您可以扩展界面,但最终会出现类似的问题。

另一种选择是接受实际工作的实现,其构造包含实现细节,非常大致:

public interface SecurableDevice {     public boolean connectWith(Connector); }

public class SecurableConnector实现Connecter {     public SecurableDeviceConnector(SecureDevice sd){...}     public void connectWith(d1){...} }

public class SecurableDeviceConnector实现Connector {     public SecurableDeviceConnector(SecureDevice sd,Authorization a){...}     public void connectWith(d1){...} }

连接建立被移出SecurableDevice;设备调用connectWith,并在那里处理。

Connector实现只能提供给需要它们的用户。

答案 1 :(得分:1)

在Java中,您无法使用普通接口控制对各个方法的访问。另一方面,可以控制对EJB接口中方法的访问,其中只有具有授权角色的用户才能调用方法 - 当然,每个客户端类都将看到暴露的方法,但只有授权用户才能成功调用它们