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()周围放置一个try/catch,为错误情况引发一个异常。如果遇到catch(),则不要执行deleteStuffFromCache()
  • 将deleteStuffFromCache()的逻辑放入方法deleteStuffFromDb(),并允许/不允许在此方法中执行
  • 请告诉我你的想法和选择的理由


    谢谢。

    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
    比传入实际对象更好)除了有效的传递值点之外,我个人认为