官术网_书友最值得收藏!

6.8 私有字段和方法

在前一版Rational類中,我們只是簡單地用類參數nd分別初始化了字段numerdenom。因此,一個Rational對象的分子和分母可能會比需要的更大。比如,分數66/42可以被正規化成等效的簡化格式11/7,但Rational類的主構造方法目前并沒有這樣處理:

要做到正規化,需要對分子和分母分別除以它們的最大公約數greatest common divisor)。比如,66和42的最大公約數是6。(換句話說,6是可以同時整除66和42的最大整數。)對66/42的分子和分母同時除以6,得到簡化形式的11/7。示例6.3展示了一種實現方式。

示例6.3 帶有私有字段和方法的Rational

在這個版本的Rational類中,我們添加了一個私有的字段g,并修改了numerdenom字段的初始化器(初始化器是初始化某個變量的代碼。例如,用來初始化numer字段的“n / g”)。由于g字段是私有的,我們只能從類定義內部訪問它,從外面訪問不到。我們還添加了一個私有方法gcd,計算傳入的兩個Int參數的最大公約數。比如,gcd(12, 8)返回4。正如你在4.1節看到的,要把一個字段或方法變成私有的,只需要簡單地在其定義之前加上private修飾符。這個私有的“助手方法”gcd的目的是將類的其他部分(在本例中是主構造方法)需要的代碼抽取出來。為了確保g字段值永遠是正值,我們傳入類參數nd的絕對值。取得絕對值的方式是對它們調用abs方法,并且可以在任何Int參數上調用abs方法來得到其絕對值。

Scala編譯器會把Rational類的3個字段的初始化器代碼按照它們在代碼中出現的先后次序編譯到主構造方法中。也就是說,g字段的初始化器,即gcd(n.abs, d.abs),會在另外兩個初始化器之前執行,因為在源碼中它是第一個出現的。g字段會被初始化成該初始化器的結果,即類參數nd的絕對值的最大公約數。接下來,g字段被用在numerdenom字段的初始化器中。通過對類參數nd分別除以它們的最大公約數g,每個Rational對象都會被構造成正規化后的形式:

主站蜘蛛池模板: 册亨县| 通化市| 峨山| 五常市| 潞城市| 辉县市| 长武县| 彭水| 洛南县| 资阳市| 麻阳| 枣强县| 福鼎市| 栖霞市| 邹城市| 安化县| 洪雅县| 湘潭市| 博兴县| 兖州市| 临高县| 开平市| 莆田市| 石台县| 阿瓦提县| 深水埗区| 新闻| 洛浦县| 卓资县| 乌什县| 郸城县| 汾阳市| 临夏市| 奉节县| 柘荣县| 屯门区| 新化县| 杨浦区| 安国市| 富裕县| 通山县|