gpt4 book ai didi

java - 如何弃用内部接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:05:45 26 4
gpt4 key购买 nike

我需要弃用 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);
}
}

SDK的用户调用如下:

AdoptDog adoptDog = new AdoptDog();
adoptDog.adoptDog("Snowball", new OnDogAdoption {
@Override
public void onDogAdoption(String dogName) {
System.out.println("Welcome " + dogName);
}
};

我想从 Dog 推广到 Pet,并弃用提及 Dog 的 API。为了向后兼容,上面采用 Snowball 的代码片段在我弃用 API 时不必更改。

我是如何尝试弃用 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);
}
}

问题是它不完全向后兼容。 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");
}
};

是否有其他方法可以弃用 AdoptDog(特别是 OnDogAdoption)并保持完全向后兼容性?

最佳答案

Java 8 允许您指定默认 方法实现。您可以使用它来帮助您,例如:

@Deprecated
public interface OnDogAdoption extends AdoptPet.OnPetAdoption {
@Deprecated
void onDogAdoption(String dogName);

default void onPetAdoption(String petName) {
onDogAdoption(petName);
}
}

通过默认实现,客户端代码将不需要实现它(但如果他们愿意的话也可以),因此应该没有编译错误。


注意: All interface methods are public by default - in fact they can only be public - there's no need to specify that.

关于java - 如何弃用内部接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50262010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com