java中closeable_java的Closeable接口和Cloneable接口
概述
java的Closeable和Cloneable兩個接口,一字之差,但是要完成的功能卻基本沒有什么聯系。最大的相同點在于,這兩個就是java基本類庫有特殊處理的接口,不按規則來,加班兩行淚。
Closeable接口
概念
Closeable是可以關閉的數據源或目標。調用close方法可釋放對象保存的資源(如打開文件)。
原理
這個實現是靠規則來保證的。實現類必須保證需要有資源釋放,并且調用close接口可以實現資源的釋放。
應用
在網上看到很多OkHttp來進行http請求的例子,里面的Response都沒調用close方法進行關閉。將例子拷貝下來壓測發現,會偶爾出現下面的告警:
[WARN] OkHttp ConnectionPool OkHttpClient? A connection to XXX was leaked. Did you forget to close a response body? To see where this was allocated, set the OkHttpClient logger level to FINE: Logger.getLogger(OkHttpClient.class.getName()).setLevel(Level.FINE);
并且部分請求沒有得到響應。
調整程序,實用try-with-resource方法關閉連接后,問題解決。這就是典型的資源沒釋放引起問題的例子。
在JDK1.7之后,只要實現了AutoCloseable或者Closeable接口的類或接口,都可以使用try-with-resource來實現異常處理和資源關閉。這種方法比手動在try外面定義資源,finally里調用close手動關閉資源代碼更優雅。
Cloneable接口
概念
Cloneable接口是一個標記接口,里面沒有定義任何內容。主要是和Object的clone方法配合使用。如果沒有實現這個接口,而調用了clone方法,會拋出CloneNotSupportException。
原理
這個方法是為了彌補Object的clone方法缺陷。Object默認是淺拷貝。也就是說它并不會把對象的所有屬性拷貝一份,而是有選擇性的拷貝。拷貝規則如下:
1.基本類型,值拷貝。2.字符串類型,生成新對象,類似值拷貝。3.對象,地址引用拷貝。這樣做的優點是節約內存。但是為了確保用戶使用的時候,是了解自己用的什么拷貝,必須實現Cloneable接口。
應用
很多時候,我們需要實現深拷貝,比如需要每一份拷貝都對值做一定修改。這樣深拷貝可避免對原值造成影響。
實現深拷貝,從代碼上有兩個比較簡單的方法。一個是利用序列化和反序列化SerializationUtils.clone方法。還可以用apache的common包中的BeanUtils. copyProperties來實現。
總結
以上是生活随笔為你收集整理的java中closeable_java的Closeable接口和Cloneable接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暗黑三无形武器哪里掉落 《暗黑破坏神
- 下一篇: java引用hive高可用连接hive_