Mic*_*sky 3 java deprecated deprecation-warning
我需要在Java SDK中弃用API以使它们更通用.但我无法弄清楚如何做以下情况:
public class AdoptDog {
public interface OnDogAdoption {
public void onDogAdoption(String dogName);
}
public void adoptDog(final String dogName, OnDogAdoption callbackObj) {
// Perform asynchronous tasks...
// Then call the callback:
callbackObj.onDogAdoption(dogName);
}
}
Run Code Online (Sandbox Code Playgroud)
SDK的用户进行如下调用:
AdoptDog adoptDog = new AdoptDog();
adoptDog.adoptDog("Snowball", new OnDogAdoption {
@Override
public void onDogAdoption(String dogName) {
System.out.println("Welcome " + dogName);
}
};
Run Code Online (Sandbox Code Playgroud)
我想概括从Dog到Pet,并弃用提到Dog的API.为了向后兼容,我在弃用API时不必更改上面采用Snowball的代码片段.
我是如何尝试弃用Dog API的:
// Introduce Pet API
public class AdoptPet {
public interface OnPetAdoption {
public void onPetAdoption(String petName);
}
public void adoptPet(final String petName, OnPetAdoption callbackObj) {
// Perform asynchronous tasks...
// Then call the callback:
if (callbackObj instanceof OnDogAdoption) {
((OnDogAdoption) callbackObj).onDogAdoption(petName);
}
else {
callbackObj.onPetAdoption(petName);
}
}
}
// Dog API now extends Pet API for backward compatibility
@Deprecated
public class AdoptDog extends AdoptPet {
@Deprecated
public interface OnDogAdoption extends AdoptPet.OnPetAdoption {
@Deprecated
public void onDogAdoption(String dogName);
}
@Deprecated
public void adoptDog(final String dogName, OnDogAdoption callbackObj) {
super.adoptPet(dogName, callbackObj);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它不完全向后兼容.SDK的用户必须实现AdoptPet.OnPetAdoption.onPetAdoption(),否则他们会收到编译器错误:
AdoptDog adoptDog = new AdoptDog();
adoptDog.adoptDog("Snowball", new OnDogAdoption {
@Override
public void onDogAdoption(String dogName) {
System.out.println("Welcome " + dogName);
}
// PROBLEM: How avoid customers having to implement this dummy method?
@Override
public void onPetAdoption(String petName) {
assert("This code should not be reached");
}
};
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以弃用AdoptDog(特别OnDogAdoption)并保持完全向后兼容性?
Java 8允许您指定default方法实现.您可以使用它来帮助您,例如:
@Deprecated
public interface OnDogAdoption extends AdoptPet.OnPetAdoption {
@Deprecated
void onDogAdoption(String dogName);
default void onPetAdoption(String petName) {
onDogAdoption(petName);
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用默认实现,客户端代码将不需要实现它(但如果他们愿意,可以),因此不应该有编译错误.
注意: 默认情况下,所有接口方法都是public- 实际上它们只能是public- 不需要指定它.
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |