【问题标题】:Can a java method return value depending upon condition?java方法可以根据条件返回值吗?
【发布时间】:2015-08-17 05:55:12
【问题描述】:

我有一个 ICoreClient 接口,AClientBClient 类实现了这个。

ICoreClient 向用户公开。

我需要在ICoreClient 接口中添加一个新方法。因此,它需要在两个客户端中实现。我不能使这种方法通用,因为它具有完全不同的签名但相似的功能。

我有 2 个接口 xxyy

ClientA 实现 xxClientB 实现 yy

所以,我决定在ICoreClient 中添加一个新的testMethod,这将为我提供xxyy 的实例,具体取决于客户。

我想根据条件从单个方法返回这些接口的实例。

ClientA:

public xx testMethod(){
  return instanceof xx;
}

ClientB:

public yy testMethod(){
  return instanceof yy;
}

ICoreClient界面应该写什么?

public zz testMethod()

我尝试在xxyy 中放置一个虚拟接口 zz(充当通用超类型)来实现此功能。但是仍然无法在各自的客户端中公开xxyy 的方法,因为最终它在zz 中进行了类型转换。

这种情况有什么已知的方法吗?

编辑:如果我将返回类型设为Object,这些接口的方法不会暴露。虽然,Object 包含xxyy 的实例,

用户仍然需要将其转换为(xxyy 用户如何知道?)以使用接口中的方法。我想公开ClientX 的方法而不必转换为@ 987654355@或ClientB...

【问题讨论】:

  • 我想返回这些接口的实例 - 你的意思是扩展这个接口的类的实例 对吧?
  • 你正在尝试做的事情对我来说似乎很奇怪。我相信有一个更好的解决方案...
  • return instanceof xx 应该做什么?这看起来不像是有效的语法。
  • 相关,可能重复:stackoverflow.com/questions/2413829/…
  • 你的接口的方法需要返回一种类型,调用者只能使用该类型的方法(不进行强制转换)。因此,如果您希望调用者能够在不强制转换的情况下调用返回值上的某个方法,则该方法需要在返回类型中。

标签: java design-patterns


【解决方案1】:

由于返回对象意味着您必须在客户端进行转换,您可以改为返回包含您可能的值的自定义对象:

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());;
        }
    }
}

然后客户端可以检查哪个结果不为空,并相应地使用类型,可以访问在 xxx 或 yyy 上定义的所有方法,具体取决于设置的方法。或者您可以添加一个方法,让您检查设置了哪个结果并做出决定,而不是检查 null...

【讨论】:

    【解决方案2】:

    编辑后,您可能正在寻找generics。你可以把你的界面变成这样

    interface ICoreClient<T>{// T will be set by each class implementing this interface
        T testMethod();
    }
    

    你的每个类都可以看起来像

    class ClientA implements ICoreClient<xx>{
        xx testMethod(){
            //return xx
        }
    }
    
    class ClientB implements ICoreClient<yy>{
        yy testMethod(){
            //return yy
        }
    }
    

    【讨论】:

    • 编辑后,问题发生了很大变化,这似乎很合适。 +1
    【解决方案3】:

    只有当xxyy 具有共同的超类型(接口或类)时才有可能。在最坏的情况下,您始终可以返回 Object。

    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
    }
    

    【讨论】:

    • +​l 用于通用超类型。它几乎应该是那个或单独的方法。
    • this is.. 的问题是.. 对象将包含xxyy.. 的实例,但用户仍然需要对其进行类型转换才能使用接口中的方法.. OP 想要的是公开XClient 的方法,而无需进行类型转换..
    猜你喜欢
    • 2011-12-10
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2011-08-22
    • 2016-09-30
    • 2020-10-23
    相关资源
    最近更新 更多