是否可以仅显示接口的特定视图或在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);
}
}
如果真的有两个独立的接口,当我想使用另一个接口时,我将不得不在它们之间进行转换,而我无法保证实现一个的对象实际上实现了另一个,所以我会必须做运行时类型检查。
因此,为了简化,我只想向用户提供一个简单的界面,只需要他需要的方法,而不是他不需要的任何业务。我该怎么做(或近似)?
由于
答案 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接口中方法的访问,其中只有具有授权角色的用户才能调用方法 - 当然,每个客户端类都将看到暴露的方法,但只有授权用户才能成功调用它们