Java 如何影响Void方法的返回值
这是我的密码:Java 如何影响Void方法的返回值,java,interface,Java,Interface,这是我的密码: deleteStuffFromDb(); // void method deleteStuffFromCache(); deleteStuffFromDb()是一个接口方法,返回类型为void 理想情况下,第一个方法将返回一个值(成功/失败)。此返回值将确定是否执行第二个方法 我可以修改接口,因为它被两个类调用。然而,作为一个没有系统全貌的O&M开发人员,我仍然有可能破坏一些东西 您建议我如何确定此void deleteStuffFromDb()的执行是否决定deleteStu
deleteStuffFromDb(); // void method
deleteStuffFromCache();
deleteStuffFromDb()是一个接口方法,返回类型为void
理想情况下,第一个方法将返回一个值(成功/失败)。此返回值将确定是否执行第二个方法
我可以修改接口,因为它被两个类调用。然而,作为一个没有系统全貌的O&M开发人员,我仍然有可能破坏一些东西
您建议我如何确定此void deleteStuffFromDb()的执行是否决定deleteStuffFromCache()的执行
以下是我的一些想法:
谢谢。将
deleteStuffFromDb()
的签名重写为deleteStuffFromDb(对象返回对象)
然后编写一个包装器接口来替换旧签名deleteStuffFromDb()
在包装器接口中,执行以下操作:
void deleteStuffFromDb() {
// initialize some dummy returnObject that doesnt get used
deleteStuffFromDb(dummyObject);
}
要使用此系统,请将returnObject
传递到接口以捕获返回值
这样,如果需要,您可以选择从接口获取返回值,但不中断使用旧接口的现有调用。将
deleteStuffFromDb()
的签名重写为deleteStuffFromDb(Object returnObject)
然后编写一个包装器接口来替换旧签名deleteStuffFromDb()
在包装器接口中,执行以下操作:
void deleteStuffFromDb() {
// initialize some dummy returnObject that doesnt get used
deleteStuffFromDb(dummyObject);
}
要使用此系统,请将returnObject
传递到接口以捕获返回值
这样,如果需要,您可以选择从接口获取返回值,但不中断使用旧接口的现有调用。我认为将返回类型从void更改为其他类型不会中断任何现有代码 如果返回类型为void,则使用它的任何代码都不希望从该方法返回。如果真的发生了,它也会立刻断裂 现在,如果您更改它并从方法返回一些值,那么在现有代码的情况下,返回的值将被忽略 如果希望void方法返回某些值,则不能使用void方法,但可以使用相反的方法 我能想到的唯一一种情况是,如果该接口有很多实现,那么更改它可能会成为一个问题
至于第二点,我更愿意保持逻辑。可能只是调用方法本身。我不认为将返回类型从void更改为其他类型会破坏任何现有代码 如果返回类型为void,则使用它的任何代码都不希望从该方法返回。如果真的发生了,它也会立刻断裂 现在,如果您更改它并从方法返回一些值,那么在现有代码的情况下,返回的值将被忽略 如果希望void方法返回某些值,则不能使用void方法,但可以使用相反的方法 我能想到的唯一一种情况是,如果该接口有很多实现,那么更改它可能会成为一个问题 至于第二点,我更愿意保持逻辑。可能只是调用方法本身 我可以修改接口,因为它被两个类调用。 然而,作为一个没有 系统的全貌 如果系统的整体情况是它只在两个地方使用,那么您当然应该同时更改这两个地方。一个完整的重新编译和系统测试将揭示是否还有其他东西被破坏 我可以修改接口,因为它被两个类调用。 然而,作为一个没有 系统的全貌
如果系统的整体情况是它只在两个地方使用,那么您当然应该同时更改这两个地方。一个完整的重新编译和系统测试将揭示是否还有任何东西被破坏。不确定这听起来有多好,但我已经看到了一些方法(例如,
Scanner.html#next()
根据失败原因抛出NoTouchElementException
和IllegalStateException
。还有更多这样的例子),这意味着成功,在失败的情况下抛出异常,例如
public void deleteStuffFromDb(){
..... usual code..
if (failedCondition){
throw new RuntimeErrorException(new Error("Couldn't delete"));
}
}
在调用者端,如果您得到抛出的异常,您可以假设它是一个失败,否则就是成功。这样可以避免更改界面。不确定这听起来有多好,但我已经看到了一些方法(例如,
Scanner.html#next()
根据失败原因抛出NoTouchElementException
和IllegalStateException
。还有更多这样的例子),这意味着成功,在失败的情况下抛出异常,例如
public void deleteStuffFromDb(){
..... usual code..
if (failedCondition){
throw new RuntimeErrorException(new Error("Couldn't delete"));
}
}
在调用者端,如果您得到抛出的异常,您可以假设它是一个失败,否则就是成功。这样可以避免更改接口。Ah,例如,我可以传入“int returnValue”,然后在执行deleteStuffFromCache()之前检查其值是否成功/失败?@Kevin不,您必须传入某种可变对象,但请参见我的答案。不要构建不必要的变通方法。@像int这样的基本类型是按值传递的(复制的),对象是按引用传递的(传递对对象的引用)。您不能将代码放入接口中,那么这将如何工作?(另外,我认为传入
null
比传入实际对象更好)除了有效的传递值点之外,我个人认为