如何弃用内部接口

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)并保持完全向后兼容性?

Ste*_*art 5

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- 不需要指定它.

  • @Stewert我知道仍然以Java 5为目标的软件.Java 7仍然被一些企业使用.仅仅因为某些东西目前没有维护并不意味着它无关紧要.有没有听说过遗留软件?他可能正在尝试修复预期在Java 5环境中运行的旧软件. (2认同)