日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java clone方法_java安全编码指南之:方法编写指南

發布時間:2024/9/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java clone方法_java安全编码指南之:方法编写指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

java程序的邏輯是由一個個的方法組成的,而在編寫方法的過程中,我們也需要遵守一定的安全規則,比如方法的參數進行校驗,不要在assert中添加業務邏輯,不要使用廢棄或者過期的方法,做安全檢查的方法一定要設置為private等。

今天我們再來深入的探討一下,java方法的編寫過程中還有哪些要注意的地方。

不要在構造函數中調用可以被重寫的方法

一般來說在構造函數中只能調用static,final或者private的方法。為什么呢?

如果父類在執行構造函數的時候調用了一個可以被重寫的方法,那么在該方法中可能會使用到未初始化的數據,從而導致運行時異常或者意外結束。

另外,還可能到方法獲取到未初始化完畢的實例,從而導致數據不一致性。

舉個例子,我們定義了一個Person的父類:

public class Person {public void printValue(){System.out.println("this is person!");}public Person(){printValue();} }

然后定義了一個Boy的子類,但是在Boy子類中,重新了父類的printValue方法。

public class Boy extends Person{public void printValue(){System.out.println("this is Boy!");}public Boy(){super();}public static void main(String[] args) {Person persion= new Person();Boy boy= new Boy();} }

輸出結果:

this is person! this is Boy!

可以看到Boy調用了自己重寫過的printValue方法。

注意,這里并不是說會產生語法錯誤,而是這樣會導致業務邏輯看起來非常混亂。

怎么解決呢?簡單辦法就是將Person中的printValue置位final即可。

不要在clone()方法中調用可重寫的方法

同樣的,我們在定義clone方法的時候也不要調用可重寫的方法,否則也會產生意想不到的變化。

還是上面的例子,這次我們添加了clone方法到Person類:

public Object clone() throws CloneNotSupportedException {Person person= (Person)super.clone();person.printValue();return person;}

接下來我們添加clone方法到Boy類:

public Object clone() throws CloneNotSupportedException {Boy clone = (Boy) super.clone();clone.printValue();return clone;}

因為在clone方法中調用了可重寫的方法,從而讓系統邏輯變得混亂。不推薦這樣使用。

重寫equals()方法

考慮一下父類和子類的情況,如果在父類中我們定義了一個equals方法,這個方法是根據父類中的字段來進行比較判斷,最終決定兩個對象是否相等。

如果子類添加了一些新的字段,如果不重寫equals方法,而是使用父類的equals方法,那么就會遺漏子類中新添加的字段,最終導致equals返回意想不到的結果。

所以一般來說,子類需要重寫equals方法。

如果重新equals方法,需要滿足下面幾個特性:

  • reflexive反射性
  • 對于一個Object a來說,a.equals(a)必須成立。

  • symmetric對稱性
  • 對于一個Object a和Object b來說,如果a.equals(b)==true,那么b.equals(a)==true一定成立。

  • transitive傳遞性
  • 對于Object a,b,c來說,如果a.equals(b)==true,b.equals(c)==true,那么a.equals(c)==true一定成立。

  • consistent一致性
  • 對于Object a,b來說,如果a和b沒有發生任何變化,那么a.equals(b)的結果也不能變。

  • 對于非空的引用a,a.equals(null) 一定要等于false
  • 具體代碼的例子,這里就不寫了,大家可以自行練習一下。

    hashCode和equals

    hashCode是Object中定義的一個native方法:

    @HotSpotIntrinsicCandidatepublic native int hashCode();

    根據Oracle的建議,如果兩個對象的equals方法返回的結果是true,那么這兩個對象的hashCode一定要返回同樣的int值。

    為什么呢?

    我們看下下面的一個例子:

    public class Girl {private final int age;public Girl(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (o == this) {return true;}if (!(o instanceof Girl)) {return false;}Girl cc = (Girl)o;return cc.age == age;}public static void main(String[] args) {HashMap<Girl,Integer> hashMap= new HashMap<>();hashMap.put(new Girl(20), 20);System.out.println(hashMap.get(new Girl(20)));} }

    上面的Girl中,我們定義了equals方法,但是并沒有重寫hashCode,最后返回的結果是null。

    因為我們new了兩次Girl這個對象,最后導致native方法中兩個不同對象的hashCode是不一樣的。

    我們可以給Girl類中添加一個hashCode方法:

    public int hashCode() {return age;}

    這樣就可以返回正確的值。

    compareTo方法的實現

    我們在實現可比較類的時候,通常需要實現Comparable接口。Comparable接口定義了一個compareTo方法,用來進行兩個對象的比較。

    我們在實現compareTo方法的時候,要注意保證比較的通用規則,也就是說,如果x.compareTo(y) > 0 && y.compareTo(z) > 0 那么表示 x.compareTo(z) > 0.

    所以,我們不能使用compareTo來實現特殊的邏輯。

    最近看了一個日本的電影,叫做dubo默示錄,里面有一集就是石頭,剪刀,布來判斷輸贏。

    當然,石頭,剪刀,布不滿足我們的通用compareTo方法,所以不能將邏輯定義在compareTo方法中。

    本文的代碼:

    learn-java-base-9-to-20/tree/master/security

    本文已收錄于 http://www.flydean.com/java-security-code-line-method/最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你! 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的java clone方法_java安全编码指南之:方法编写指南的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。