Java 8 HttpClient 4.5 HttpGet和HttpPost在一个函数中

Java 8 HttpClient 4.5 HttpGet和HttpPost在一个函数中,java,java-8,httpclient,apache-httpclient-4.x,Java,Java 8,Httpclient,Apache Httpclient 4.x,我正在编写将与HttpGet和HttpPost一起使用的函数。 是这样的: private void initialize(HttpRequestBase method) { if(method == new HttpPost()) { String body = "body"; HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); method.setEntity

我正在编写将与HttpGet和HttpPost一起使用的函数。 是这样的:

private void initialize(HttpRequestBase method)
{
    if(method == new HttpPost())
    {
    String body = "body";
        HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
        method.setEntity(entity);
}

问题是HttpRequestBase不支持.setEntity。如何编写支持HttpGet和HttpPost的函数而不出现类似问题?

解决此问题的方法是使用
instanceof
检查类型并使用强制转换。像这样:

private void initialize(HttpRequestBase method)
{
    if(method instanceof HttpPost)
    {
        String body = "body";
        HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
        ((HttpPost) method).setEntity(entity);
    }
}
<> P>但无论何时使用CAST,都应该考虑到可能会有一个更优雅的解决方案。在这种情况下,我认为一个更优雅的解决方案是使用方法重载,并为
HttpPost
实例提供一个特定的方法

private void initialize(HttpPost method)
{
    String body = "body";
    HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
    method.setEntity(entity);
}
当然,这意味着您需要为
HttpGet
(以及希望支持的
HttpRequestBase
的任何其他子类)使用单独的方法。在
GET
POST
之间共享的任何公共代码都应该提取到较小的方法中,这两个
initialize()
方法都会调用这些方法

private void initialize(HttpGet method)
{
    // ...
}

当然,您可能会认为,这会挫败为
GET
POST
创建一个处理程序的整个过程。你是对的。但是您应该质疑尝试创建一个同时处理这两个问题的方法的整个过程。也许最优雅的设计是将它们分开处理。毕竟,这正是您所使用的框架的作者选择要做的。

您知道您的
if
条件永远不会为真,不是吗?与新对象比较的任何现有对象引用都将返回
false
。哦,你说得对。任何方法?
if(HttpPost的方法实例)
当然,使用
instanceof
。然后你也可以施展才华。但这是非常基本的Java。也许你应该这样做。谢谢你的回复,我将尝试创建两个独立的方法——这是我想要避免的事情,因为这些方法中90%的代码都是相同的,在两个初始值设定者都调用的较小的方法中封装通用功能。@SamuelTexeira好主意。完成。