Java API设计-口述方法顺序是一种好的做法吗?
getResult方法不是一个糟糕的设计吗?它迫使用户在调用另一个方法之前调用它?你将如何解决这个问题?您希望返回-1还是说null(在对象类型的情况下)并让调用者知道如果null返回该怎么做?或者,如果您确定它不会为null,但要使返回值不为null,您必须在调用getResult方法之前调用另一个方法,您会抛出RuntimeException吗?(或者检查异常?这里有两种方法。要么使其同步(即,Java API设计-口述方法顺序是一种好的做法吗?,java,api,Java,Api,getResult方法不是一个糟糕的设计吗?它迫使用户在调用另一个方法之前调用它?你将如何解决这个问题?您希望返回-1还是说null(在对象类型的情况下)并让调用者知道如果null返回该怎么做?或者,如果您确定它不会为null,但要使返回值不为null,您必须在调用getResult方法之前调用另一个方法,您会抛出RuntimeException吗?(或者检查异常?这里有两种方法。要么使其同步(即,doExecuteMySpecialAlgorithm实际返回结果),要么使其异步 第一个是显而易
doExecuteMySpecialAlgorithm
实际返回结果),要么使其异步
第一个是显而易见的,第二个可以通过返回一个Future
对象来实现。无论哪种方式,调用方都不需要考虑调用方法的正确顺序
在某些情况下,强制方法的调用顺序(例如加密类中的doFinal
方法)是可以的,但是您仍然应该避免以用户必须仔细考虑如何调用方法的方式生成代码。显然,他需要知道调用什么,但是如果他需要按特定顺序调用5个方法,这可能意味着应该只有1个方法
我的意思是,如果你想强制调用方依次调用
method1()
,method2()
,method3()
,你真的应该让他调用method()
,它在内部调用私有方法method1()
,method2()
和method3()
。这样,代码结构良好,但调用方不能通过错误的顺序调用方法来捏造事实。这里有两种方法。要么使其同步(即,doExecuteMySpecialAlgorithm
实际返回结果),要么使其异步
第一个是显而易见的,第二个可以通过返回一个Future
对象来实现。无论哪种方式,调用方都不需要考虑调用方法的正确顺序
在某些情况下,强制方法的调用顺序(例如加密类中的doFinal
方法)是可以的,但是您仍然应该避免以用户必须仔细考虑如何调用方法的方式生成代码。显然,他需要知道调用什么,但是如果他需要按特定顺序调用5个方法,这可能意味着应该只有1个方法
我的意思是,如果你想强制调用方依次调用
method1()
,method2()
,method3()
,你真的应该让他调用method()
,它在内部调用私有方法method1()
,method2()
和method3()
。这样,代码结构良好,但调用方不能通过错误的顺序调用方法来捏造事实。这里有两种方法。要么使其同步(即,doExecuteMySpecialAlgorithm
实际返回结果),要么使其异步
第一个是显而易见的,第二个可以通过返回一个Future
对象来实现。无论哪种方式,调用方都不需要考虑调用方法的正确顺序
在某些情况下,强制方法的调用顺序(例如加密类中的doFinal
方法)是可以的,但是您仍然应该避免以用户必须仔细考虑如何调用方法的方式生成代码。显然,他需要知道调用什么,但是如果他需要按特定顺序调用5个方法,这可能意味着应该只有1个方法
我的意思是,如果你想强制调用方依次调用
method1()
,method2()
,method3()
,你真的应该让他调用method()
,它在内部调用私有方法method1()
,method2()
和method3()
。这样,代码结构良好,但调用方不能通过错误的顺序调用方法来捏造事实。这里有两种方法。要么使其同步(即,doExecuteMySpecialAlgorithm
实际返回结果),要么使其异步
第一个是显而易见的,第二个可以通过返回一个Future
对象来实现。无论哪种方式,调用方都不需要考虑调用方法的正确顺序
在某些情况下,强制方法的调用顺序(例如加密类中的doFinal
方法)是可以的,但是您仍然应该避免以用户必须仔细考虑如何调用方法的方式生成代码。显然,他需要知道调用什么,但是如果他需要按特定顺序调用5个方法,这可能意味着应该只有1个方法
我的意思是,如果你想强制调用方依次调用
method1()
,method2()
,method3()
,你真的应该让他调用method()
,它在内部调用私有方法method1()
,method2()
和method3()
。这样,代码结构良好,但调用方不能通过错误的顺序调用方法来捏造事实。在您的示例中,我将执行以下操作:
public abstract class A {
private int result=-1;
public void final doExecuteMySpecialAlgorithm() {
result=0;
//do something here and get a new result
//it won't be -1.
}
public int getResult() {
if(result==-1)
throw new RuntimeException("Invoke my special algorithm first!");
return result;
}
}
通过这种方式,用户可以首先执行“特殊”算法,或者如果他们“忘记”了,您(作为API编写者)可以为他们捕获它并执行此操作(而不是抛出错误)
这样做会使您的对象为您完成工作(面向对象设计),当然这是您的API设计,我会假设有大量的文档说明,如果我调用getResult
,我必须首先调用doExecuteMysSpecialAlgorithm
。。。无论您选择实现什么,都必须记录用户被命令在函数Y之前调用函数X,或者未定义
public abstract class A {
private int result=-1;
public void final doExecuteMySpecialAlgorithm() {
result=0;
//do something here and get a new result
//it won't be -1.
}
public int getResult() {
if(result==-1)
doExecuteMySpecialAlgorithm();
return result;
}
}