java方法能否根据条件返回值?
我有一个java方法能否根据条件返回值?,java,design-patterns,Java,Design Patterns,我有一个ICoreClient接口,AClient和BClient类实现了这一点 ICoreClient为用户公开 我需要在ICoreClient界面中添加一个新方法。因此,它需要在两个客户端中实现。我无法使此方法通用,因为它具有完全不同的签名,但具有相似的功能 我有两个接口xx和yy ClientA实现xx和ClientB实现yy 因此,我决定在ICoreClient中添加一个新的testMethod,它将根据客户机为我提供xx或yy的实例 我想根据条件从单个方法返回这些接口的实例 在Clie
ICoreClient
接口,AClient
和BClient
类实现了这一点
ICoreClient
为用户公开
我需要在ICoreClient
界面中添加一个新方法。因此,它需要在两个客户端中实现。我无法使此方法通用,因为它具有完全不同的签名,但具有相似的功能
我有两个接口xx
和yy
ClientA
实现xx
和ClientB
实现yy
因此,我决定在ICoreClient
中添加一个新的testMethod
,它将根据客户机为我提供xx
或yy
的实例
我想根据条件从单个方法返回这些接口的实例
在ClientA
:
public xx testMethod(){
return instanceof xx;
}
public yy testMethod(){
return instanceof yy;
}
在ClientB
:
public xx testMethod(){
return instanceof xx;
}
public yy testMethod(){
return instanceof yy;
}
我应该在ICoreClient
界面中写什么?
public zz testMethod()
我尝试放置一个虚拟接口zz
(充当一个通用超类型)xx
和yy
都实现了这一点。但仍然无法在各自的客户机中公开xx
和yy
的方法,因为它最终在zz
中进行了类型化
对于这种情况,有什么已知的方法吗
编辑:如果我将返回类型设置为对象
,则这些接口的方法不会公开。虽然,对象包含xx
或yy
的实例
用户仍然需要将其转换为(
xx
或yy
用户如何知道?)才能使用界面中的方法。。我想公开ClientX
的方法,而不必强制转换到ClientA
或ClientB
。只有当xx
和yy
有一个公共的超类型(接口或类)时才有可能。在最坏的情况下,始终可以返回对象
public Object testMethod () // or a more specific common super type of `xx` and `yy`
{
if (..some condition..) {
return ..instanceof `xx`..;
} else if (..other condition..) {
return ..instanceof `yy`..;
}
return null; // or some other default instnace
}
由于返回对象意味着您必须在客户端强制转换,因此您可以返回一个包含可能值的自定义对象:
public class MethodResult
{
private xxx xResult;
private yyy yResult;
public MethodResult(xxx xResult){
this.xResult=xResult;
}
public MethodResult(yyy Result){
this.yResult=yResult;
}
public xxx getXResult(){return xResult;}
public yyy getYResult(){return yResult;}
}
然后返回此类型:
public MethodResult testMethod ()
{
if (..some condition..) {
return new MethodResult(new xxx());
} else if (..other condition..) {
return new MethodResult(new yyy());;
}
}
}
然后,客户机可以检查哪个结果不是null,并相应地使用类型,根据设置的方法,可以访问xxx或yyy上定义的所有方法。或者,您可以添加一个方法,该方法允许您检查设置了哪些结果,而不是检查null…在您的编辑之后,您可能正在查找。你可以这样做你的界面
interface ICoreClient<T>{// T will be set by each class implementing this interface
T testMethod();
}
接口ICoreClient{//T将由实现此接口的每个类设置
T testMethod();
}
你的每一个班级看起来都像
class ClientA implements ICoreClient<xx>{
xx testMethod(){
//return xx
}
}
class ClientB implements ICoreClient<yy>{
yy testMethod(){
//return yy
}
}
类ClientA实现ICoreClient{
xx测试方法(){
//返回xx
}
}
类ClientB实现ICoreClient{
yy测试方法(){
//返回yy
}
}
我想返回这些接口的实例-你是说扩展了这个接口的类的实例吗?你想做的对我来说似乎很奇怪。我相信有一个比这个更好的解决方案…xx的返回实例应该做什么?这看起来不像有效语法。相关,可能重复:接口的方法需要返回一个类型,调用方只能使用该类型中的方法(不强制转换)。因此,如果您希望调用方能够在不强制转换返回值的情况下调用返回值上的某个方法,则该方法需要在返回类型中。+l
用于普通超类型。基本上应该是那样或是分开的方法。。对象将包含xx
或yy
的实例。。但是用户仍然需要使用界面中的方法对其进行类型转换。。OP想要的是公开XClient
的方法,而不必进行打字。编辑之后,问题发生了很大变化,这似乎很适合+1.