以下使用方法重载来控制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;
}
答案 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;
}
}
以上解决方案违反了多个面向对象的原则。此类问题的正确解决方案是使用构建器模式。如果您需要构建器解决方案,请告诉我。