JavaAPI演进:如何拒绝接受对象的方法

JavaAPI演进:如何拒绝接受对象的方法,java,api,overloading,api-design,Java,Api,Overloading,Api Design,由于历史原因,我必须支持的API包含一个方法 void item(Object id) 其中,id可以是数字标识或字符串别名。由于对接受哪些类型及其语义存在混淆,我想提供两种新方法 void item(CharSequence alias); void item(int index); 但由于我不能破坏下游代码,所以我想提供一个不推荐的方法来重新训练旧的API @Deprecated void item(Object obj); 现在出现了一个新问题。以下代码将调用旧的、不推荐使用的方法:

由于历史原因,我必须支持的API包含一个方法

void item(Object id)
其中,
id
可以是数字标识或字符串别名。由于对接受哪些类型及其语义存在混淆,我想提供两种新方法

void item(CharSequence alias);
void item(int index);
但由于我不能破坏下游代码,所以我想提供一个不推荐的方法来重新训练旧的API

@Deprecated
void item(Object obj);
现在出现了一个新问题。以下代码将调用旧的、不推荐使用的方法:

Integer index = 3;
myClass.item(index); // ← will call item(Object)
我很想调用新方法
item
,这样就不必重构(只是重新编译)下游代码,也不必使用
@Deprecated
方法。但我也不想提供两种方法
item(int)
item(Integer)
,或者只提供一种方法
item(Integer)
,因为大多数下游代码都使用
int


像这样封装API的首选方式是什么?我考虑过在默认jar中不提供
项(对象)
方法,但在该方法中提供一个额外的
-legacy
jar。但这也会对下游代码产生影响。

可能会添加
item(Integer)
并将其标记为不推荐使用?@kostya但这会对下游代码产生调用
intValue
的影响,而不会使用Java的自动装箱。此外,我不认为添加一个新的不推荐使用的方法比仅仅调用旧的不推荐使用的方法更有价值。不过,感谢您的建议,我没有想到:)为了让自己更清楚:添加
item(int)
和弃用的
item(Integer)
,这样旧代码就可以慢慢迁移到使用
item(int)
。我知道这感觉有点不舒服,但我不认为有更好的解决办法。向后兼容性很难。注意下游代码中的
项(空)
)但是保留不推荐的
项(对象)
并缓慢迁移旧代码有什么好处呢?保留
item(Object)
也会提供ABI兼容性。实际上,您是对的。您可能会添加
item(Integer)
并将其标记为不推荐使用?@kostya,但这会对下游代码强制调用
intValue
,而不能使用Java的自动装箱。此外,我不认为添加一个新的不推荐使用的方法比仅仅调用旧的不推荐使用的方法更有价值。不过,感谢您的建议,我没有想到:)为了让自己更清楚:添加
item(int)
和弃用的
item(Integer)
,这样旧代码就可以慢慢迁移到使用
item(int)
。我知道这感觉有点不舒服,但我不认为有更好的解决办法。向后兼容性很难。注意下游代码中的
项(空)
)但是保留不推荐的
项(对象)
并缓慢迁移旧代码有什么好处呢?保留
项(对象)
也会提供ABI兼容性。实际上,你是对的