【问题标题】:Usage of @deprecated with parameter type change in method definition在方法定义中使用 @deprecated 并更改参数类型
【发布时间】:2014-01-23 15:26:50
【问题描述】:

我正在创建一个用于数据库访问的 API。

已经有一个应用程序在使用我们的 API。在这种情况下,如果我想将参数的类型从接口更改为实现类型。

例如,

API 版本 1.0:

getDomain1Data(SearchBy searchBy,List<String> someList);

我可以将其更改为以下内容吗?我要确保 API 用户不会使用另一个域的表列名称搜索 domain1 数据。

getDomain1Data(Domain1SearchBy searchBy,List<String> someList);

如果我这样做,我应该将 deprecated 添加到第一种方法,然后添加第二种方法,或者我可以将第一种方法替换为第二种方法。

谢谢。

【问题讨论】:

    标签: java deprecated method-parameters


    【解决方案1】:

    如果已经有一个应用使用你的接口方法,那么删除之前的方法是不明智的。 我宁愿添加getDomain1Data(Domain1SearchBy searchBy,List&lt;String&gt; someList);,并在前一个注解中添加@Deprecated

    示例代码:

    @Deprecated
    static interface SearchBy {
    }
    static class Domain1SearchBy implements SearchBy {
    }
    
    static interface Api10 {
        void some(SearchBy a);
    }
    static interface Api11 extends Api10 {
        void some(Domain1SearchBy b);
    }
    
    static class Api10Impl implements Api10 {
        @Deprecated
        public void some(SearchBy a) {
            System.out.println("some searchby");
        }
    }
    static class Api11Impl extends Api10Impl implements Api11 {
        public void some(Domain1SearchBy b) {
            System.out.println("some domain1");
        }
    }
    
    public static void main(String[] args) {
    
        //with api 1.0
        Api10 api10 = new Api10Impl();
        api10.some(new SearchBy() {});
        api10.some(new Domain1SearchBy());
    
        //with api 1.1
        Api11 api11 = new Api11Impl();
        api11.some(new SearchBy() {});
        api11.some(new Domain1SearchBy());
    
    }
    

    结果:

    some searchby
    some searchby
    some searchby
    some domain1
    

    【讨论】:

    • 我是否应该复制该方法并添加已弃用的注释?
    • 我确实相信。不过,它不是重复的。
    • 我认为 @Deprecated 标志应该放在 SearchBy 和 getDomain1Data(SearchBy searchBy,List someList); 中。然后添加具有不同参数的方法应该可以正常工作。从现在开始,每个新应用都应该使用 Domain1SearchBy,因此它意味着使用 getDomain1Data(Domain1SearchBy searchBy,List someList);。
    【解决方案2】:

    如果您要更改正在使用的方法,就像在这种情况下一样,那么我认为正确的方法是添加新方法并将@Deprecated 标记添加到旧方法并解释原因它已被弃用,应该使用哪种方法。

    【讨论】:

      【解决方案3】:

      您不能只用第二个替换第一个,因为客户端可能会使用SearchBy 对象作为实际参数来调用它。这会导致编译错误。

      同时使用这两种方法也是不可能的,因为它们是模棱两可的。如果使用Domain1SearchBy 对象调用,这两种方法都适用,因此无法决定使用哪一种。

      您唯一的两个选择是给新的另一个名称或更改参数计数。

      【讨论】:

      • 投反对票的人能否解释一下,以便我改进我的答案?
      • 我认为@Deprecated标志应该放在SearchBygetDomain1Data(SearchBy searchBy,List&lt;String&gt; someList);中。然后添加具有不同参数的方法应该可以正常工作。从现在开始,每个新应用都应该使用Domain1SearchBy,因此它意味着使用getDomain1Data(Domain1SearchBy searchBy,List&lt;String&gt; someList);
      • @Pisek 你错过了Domain1SearchBySearchBy 的子类型。这就是使用SearchBy 进行任何方法调用的原因。 @Deprecated 注释不会改变这一点。如果使用了带注释的成员,它只会生成编译器警告。
      • 我没有错过。请记住,您正在使用 API 1.0 编写一些应用程序 - 您必须使用 SearchBy 的一些实现和相应的方法。现在更改为更新的 API SearchBy 已弃用。因此,您将使用Domain1SearchBy 类和对应的getDomain1Data(Domain1SearchBy... 来编写。没有歧义。
      • If called with SearchBy object both methods would be applicable so it can't be decided which one to use. - 不正确 - 如果使用 SearchBy 对象,则使用 getDomain1Data(SearchBy...
      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多