Python 和 Java 处理废弃API的方法
Python处理废弃API
观察显示,Python api在不同的粒度上被弃用,这些粒度被分为四类:函数、参数、参数值等。
一、装饰器:库贡献者用于声明Python api的弃用的策略是通过所谓的Python装饰器机制来实现的。与Java注释机制类似,Python装饰器提供了一种方法来扩展函数的行为,而不需要显式地修改它。
二、硬编码的警告:API弃用的声明是通过在运行时向API用户提供硬编码的警告消息来实现的。
三、注释:在源代码中,废弃号被声明为注释(即自然语言)。
Java注解和Python装饰器的区别
- Java 注解也叫元数据,一种代码级别的说明。Python 装饰器是一种语法糖。
- 注解是给别人看的,功能不仅仅由注解决定;装饰器直接拦截,直接改变被装饰对象的行为!
- 注解(Annotation):仅提供附加元数据支持,并不能实现任何操作。需要另外的 Scanner 根据元数据执行相应操作。
- 装饰器(Decorator):仅提供定义劫持,能够对类及其方法的定义并没有提供任何附加元数据的功能。
Python装饰器
首先需要理解,Python中的一切元素皆是对象,包括函数。
我写了一个简单的double函数,然后进行编译,可以发现,def double(x):
首先LOAD了一个Code object的对象,然后LOAD了一个函数名double,MAKE_FUNCTION将二者变成了一个FUCTION object,然后将FUNCTION OBJECT保存到了double里,所以我们在Python中定义一个函数时,只是新建了一个变量,然后将function object保存到了这个变量里。这就可以理解了函数可以作为参数和返回值进行传递了。
特殊的是,函数对象是一个callable,还需要某些参数x,才能调用。实际上,python中的任何变量你都可以调用,但是这个东西如果不是callable的话在runtime时会出错。
decorate
举一个简单的例子,前两行定义了一个函数dec,阴影部分才是decorate真正起作用的部分,中间定义了一个double函数,而真正decorate起作用的部分时CALL_FUNCTION和STORE_NAME。可以看出,decorate完全等价于
double = dec(double)
decorate不过是一个输入和输出都为函数的函数
带参数的decorate,相当于两次函数调用。
Java处理废弃的API
注解 @Deprecated 可以标记 Java API 状态,可以是以下几种:
使用它存在风险,可能导致错误
可能在未来版本中不兼容
可能在未来版本中删除
一个更好和更高效的方案已经取代它。
@Deprecated 可以标注很多元素:类、接口、方法、属性。。。。。。
这个注解也是给编译器看的,也是做编译检查的;
被这个注解标注的元素表示已过时,在编译器进行编译的时候会进行“过时提醒”;
@Deprecated
public class AnnotationTest03_User {
@Deprecated
public AnnotationTest03_User(){
System.out.println("我是AnnotationTest03_User(),是一个被@Deprecated修饰的类,已经过时。");
}
}