使用requires some-module表示當前模組依賴於指定的some-module。若使用 requires transitive some-module表示任何需要當前模組的模組也將依賴於some-module。單字transitive可以解釋為「可傳遞的」,意思大概就是把這層依賴關係也傳遞出去。
這樣的現象在開源的程式設計裡其實相當常見。若模組B在開發過程中引用了模組C;當模組A要引用模組B時,自然也會需要模組C。因此B依賴C的關係,傳遞給A後變成A除了依賴B之外也要依賴C。原本的模組資訊檔使用requires時可以編寫為:
若使用requires transitive則可以簡化為:
- module B {
- exports B;
- requires C;
- }
- module A {
- requires B;
- requires C;
- }
- module B {
- exports B;
- requires transitive C;
- }
- module A {
- requires B;
- }
以上假設模組和套件同名。另外,只是模組資訊檔可以簡化,模組A依然需要模組B與模組C的函式庫。
相似的概念,我們可以將zoo專案的4個模組全部重新檢視。
1. 修改模組zoo.animal.feeding
模組zoo.animal.feeding是最基本的,沒有變動:
- module zoo.animal.feeding {
- exports zoo.animal.feeding;
- }
2. 修改模組zoo.animal.care
模組zoo.animal.care原本是:將行3修改如下。以後任何模組使用到模組zoo.animal.care都不需要在模組資訊檔內參照模組zoo.animal.feeding,我們將在下個模組驗證這個結果:
- module zoo.animal.care {
- exports zoo.animal.care.medical;
- requires zoo.animal.feeding;
- }
- module zoo.animal.care {
- exports zoo.animal.care.medical;
- requires transitive zoo.animal.feeding;
- }
3. 修改模組zoo.animal.talks
模組zoo.animal.talks原本是:
- module zoo.animal.talks {
- exports zoo.animal.talks.content;
- exports zoo.animal.talks.media;
- exports zoo.animal.talks.schedule;
- requires zoo.animal.feeding;
- requires zoo.animal.care;
- }
簡化時可以直接移除原本行5,並把行6由requires也改為requires transitive,以後任何模組使用到模組zoo.animal.talks都不需要在模組資訊檔內參照模組zoo.animal.care:
- module zoo.animal.talks {
- exports zoo.animal.talks.content to zoo.staff;
- exports zoo.animal.talks.media;
- exports zoo.animal.talks.schedule;
- requires transitive zoo.animal.care;
- }
4. 修改模組zoo.staff
模組zoo.staff原本如下:簡化後可以去除兩個requires敘述:
- module zoo.staff {
- requires zoo.animal.feeding;
- requires zoo.animal.care;
- requires zoo.animal.talks;
- }
- module zoo.staff {
- requires zoo.animal.talks;
- }
沒有留言:
張貼留言