国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Effective Java

2019-11-14 22:43:12
字體:
來源:轉載
供稿:網友
Effective java - 將可變性最小化

不可變類,即實例不能被修改的類,實例中包含的所有信息在對象的生命周期內固定不變。常見的比如String、基本類型的封裝類、BigDecimal、BigInteger。

相對與可變類,不可變更易于設計、實現、使用,且更穩定(less PRone to error)更安全。比如,不可變類本質上就是線程安全的,不需要做同步處理,使用起來也非常方便。

設計不可變類,我們有5個原則

  • 不提供任何可修改對象狀態的方法。(這種方法也成為mutator,相應詞匯"可變性(mutability)")
  • 保證類不會被擴展(extends),以防止通過子類修改對象狀態。防止擴展的方式通常是用final修飾。
  • 盡量使所有的field加上final修飾。
  • 盡量使所有的field都是private。雖然給一個基本類型或者指向不可變引用的field加上final可以防止直接修改field,但我們還需要考慮在以后的版本中變更field的表示法。
  • Ensure exclusive access to any mutable components.即,如果一個field指向可變對象,則需要防止用戶直接獲得該可變對象??梢酝ㄟ^在構造器、getter、readObject中返回對象的拷貝的方式解決這一問題。

以書中代碼為例,這是一種典型的不可變類:

public final class Complex {    private final double re;    private final double im;    public Complex(double re, double im) {        this.re = re;        this.im = im;    }    // Accessors with no corresponding mutators    public double realPart() {        return re;    }    public double imaginaryPart() {        return im;    }    public Complex add(Complex c) {        return new Complex(re + c.re, im + c.im);    }    public Complex subtract(Complex c) {        return new Complex(re - c.re, im - c.im);    }    public Complex multiply(Complex c) {        return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);    }    public Complex divide(Complex c) {        double tmp = c.re * c.re + c.im * c.im;        return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re                * c.im)                / tmp);    }    @Override    public boolean equals(Object o) {        if (o == this)            return true;        if (!(o instanceof Complex))            return false;        Complex c = (Complex) o;        // See page 43 to find out why we use compare instead of ==        return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0;    }    @Override    public int hashCode() {        int result = 17 + hashDouble(re);        result = 31 * result + hashDouble(im);        return result;    }    private int hashDouble(double val) {        long longBits = Double.doubleToLongBits(re);        return (int) (longBits ^ (longBits >>> 32));    }    @Override    public String toString() {        return "(" + re + " + " + im + "i)";    }}

鑒于不可變對象本質上就是線程安全的,不可變對象可以自由地進行傳遞,根本不用考慮在構造器或者getter中進行實例拷貝。但正如上面的代碼,使用不可變類的方法改變其自身狀態時都要返回一個單獨的對象。如果創建對象的開銷較大,這將有可能導致性能問題。

站在類提供者的立場上,我們有兩種方法可以解決這一問題:

  • 在類內部使用的操作盡量使用基本類型。
  • 如果可以預想到那些狀態經常會改變,則相應提供一個包級私有的配套類,比如,StringBuilder相對于String。

另外,如果因為某種原因不能使用final修飾不可變類,但又不希望被擴展,除了使用final是否還有其他方法。方法就是,使用public static工廠方法取代所有public構造器。比如:

public static Complex valueOf(double re, double im) {    return new Complex(re, im);}public static Complex valueOfPolar(double r, double theta) {    return new Complex(r * Math.cos(theta), r * Math.sin(theta));}

上一篇:Java TCP Socket編程

下一篇:Effective Java

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汽车| 香港| 石景山区| 内江市| 图木舒克市| 五常市| 高州市| 临猗县| 天祝| 福海县| 甘肃省| 磐石市| 芦山县| 彭州市| 宝兴县| 慈利县| 岳阳县| 宜兴市| 永嘉县| 桦川县| 秦安县| 凌海市| 台山市| 灵石县| 永年县| 盐边县| 望谟县| 东阿县| 琼海市| 达拉特旗| 丹巴县| 西吉县| 焉耆| 张家界市| 共和县| 天水市| 莆田市| 渝中区| 吴旗县| 思南县| 晋州市|