覆盖Java方法以控制行为(python可选的类似args)

时间:2019-02-01 23:13:21

标签: java

以下使用方法重载来控制requestWork()的行为的方式是否合理?

通常,在python中,我会为passId和paperId设置可选参数。

def requestWork(start, end, passId=None, paperId=None):
     if passId is not None: 
         # do passId stuff
     else:
         # do paperId stuff

不确定上述Java到底是什么

public static int doFlag = true;
public static String PASS_ID = "passID";
public static String PAPER_ID_ONE = "paperIdOne";
public static String PAPER_ID_TWO = "paperIdTwo";
public int getSomething(DateTime start, DateTime end) {
    if (doFlag) {
        return requestWorkPassId(start, end, PASS_ID);
    } else {
        return requestWork(start, end PAPER_ID_ONE) + requestWork(start, end, PAPER_ID_TWO);
    }
}

public int requestWorkPassId(DateTime start, DateTime end, String passId) {
    return requestWork(start, end, passId, "");
}

public int requestWork(DateTime start, DateTime end, String paperId) {
    return requestWork(start, end, "", paperId);
}

public int requestWork(DateTime start, DateTime end, passId, paperId) {
    int output;
    if (!String.isNullOrEmpty(paperId) {
        output = SOME_EXTERNAL_API(paperId);
    } else {
        output = SOME_EXTERNAL_API_TWO(passId);
    }
    //common check for output
    return output;

}

2 个答案:

答案 0 :(得分:1)

虽然没有与您发布的Python代码完全相同的Java,您仍然可以在某种程度上实现它。

在Java中完成此类操作的通常方式如下:

public int requestWorkPassId(DateTime start, DateTime end) {
    return requestWork(start, end,  "");
}

public int requestWork(DateTime start, DateTime end, String passId) {
    return requestWork(start, end, passId, "");
}

public int requestWork(DateTime start, DateTime end, String passId, String paperId) {
    int output;
    if (!String.isNullOrEmpty(paperId) {
        output = SOME_EXTERNAL_API(paperId);
    } else {
        output = SOME_EXTERNAL_API_TWO(passId);
    }
    //common check for output
    return output;
}
<!-- language: java -->

[假设d1和d2是DateTime对象] 通过始终根据参数数量将函数调用传递给下一个函数,这非常简单,这在Java中是一种常见的做法: 通过调用requestWork(d1,d2),您可以为passId和paperId使用一个空字符串。 通过调用requestWork(d1,d2,“ foo”),您将“ foo”用作passId,并将空String用作paperId。 通过调用requestWork(d1,d2,“”,“ foo”),您将为passId使用空字符串,为paperId使用“ foo”(我猜这是Python击败Java的地方)。 通过调用requestWork(d1,d2,“ foo”,“ bar”),您只需使用passId =“ foo”和paperId =“ bar”调用包含实际代码的函数。

我希望这对您的项目有帮助并祝您好运, 来自德国的问候!

答案 1 :(得分:1)

我会推荐一种更加面向对象的方法。您不需要重载。


首先要定义一个具有函数所需的所有属性的对象:

class Work {
    DateTime start, end;
    String paperId = ""; // defaults to ""
    String passId = ""; // defaults to ""
}

让根函数接受Work对象:

public int requestWork(Work work) {
    int output;
    if (!String.isNullOrEmpty(work.paperId) {
        output = SOME_EXTERNAL_API(work.paperId);
    } else {
        output = SOME_EXTERNAL_API_TWO(work.passId);
    }
    //common check for output
    return output;
}

并将Work对象传递给函数:

Work work = new Work();
work.start = ...;
work.end = ...;
// paperId defaults to ""
// passId defaults to ""

requestWork(work);

如果您决定扩大功能范围以考虑更多参数,则无需大量的重载方法。但是,不会强制客户端指定必需的数据。

要解决此问题,请强制客户端通过构造函数指定所需的数据:

class Work {
    DateTime start, end;
    String passId; // defaults to null
    String paperId; // defaults to null

    Work(DateTime start, DateTime end) {
        this.start = start;
        this.end = end;
    }
}

以上解决方案违反了多个面向对象的原则。此类问题的正确解决方案是使用构建器模式。如果您需要构建器解决方案,请告诉我。