書名: Scala編程(第5版)作者名: (德)馬丁·奧德斯基等本章字數: 729字更新時間: 2022-05-06 15:51:46
6.8 私有字段和方法
在前一版Rational類中,我們只是簡單地用類參數n和d分別初始化了字段numer和denom。因此,一個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,并修改了numer和denom字段的初始化器(初始化器是初始化某個變量的代碼。例如,用來初始化numer字段的“n / g”)。由于g字段是私有的,我們只能從類定義內部訪問它,從外面訪問不到。我們還添加了一個私有方法gcd,計算傳入的兩個Int參數的最大公約數。比如,gcd(12, 8)返回4。正如你在4.1節看到的,要把一個字段或方法變成私有的,只需要簡單地在其定義之前加上private修飾符。這個私有的“助手方法”gcd的目的是將類的其他部分(在本例中是主構造方法)需要的代碼抽取出來。為了確保g字段值永遠是正值,我們傳入類參數n和d的絕對值。取得絕對值的方式是對它們調用abs方法,并且可以在任何Int參數上調用abs方法來得到其絕對值。
Scala編譯器會把Rational類的3個字段的初始化器代碼按照它們在代碼中出現的先后次序編譯到主構造方法中。也就是說,g字段的初始化器,即gcd(n.abs, d.abs),會在另外兩個初始化器之前執行,因為在源碼中它是第一個出現的。g字段會被初始化成該初始化器的結果,即類參數n和d的絕對值的最大公約數。接下來,g字段被用在numer和denom字段的初始化器中。通過對類參數n和d分別除以它們的最大公約數g,每個Rational對象都會被構造成正規化后的形式:

- Web程序設計及應用
- Mastering Ext JS(Second Edition)
- Learning Informatica PowerCenter 10.x(Second Edition)
- 軟件測試技術指南
- Visual FoxPro程序設計
- Mastering ROS for Robotics Programming
- NoSQL數據庫原理
- ServiceNow:Building Powerful Workflows
- 好好學Java:從零基礎到項目實戰
- SwiftUI極簡開發
- scikit-learn Cookbook(Second Edition)
- Shopify Application Development
- Developing Java Applications with Spring and Spring Boot
- 產品架構評估原理與方法
- Pandas入門與實戰應用:基于Python的數據分析與處理