使用requires some-module表示當前模組依賴於指定的some-module。若使用 requires transitive some-module表示任何需要當前模組的模組也將依賴於some-module。單字transitive可以解釋為「可傳遞的」,意思大概就是把這層依賴關係也傳遞出去。
這樣的現象在開源的程式設計裡其實相當常見。若模組B在開發過程中引用了模組C;當模組A要引用模組B時,自然也會需要模組C。因此B依賴C的關係,傳遞給A後變成A除了依賴B之外也要依賴C。原本的模組資訊檔使用requires時可以編寫為:
module B {
exports B;
requires C;
}
module A {
requires B;
requires C;
}
若使用requires
transitive則可以簡化為: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原本是:module zoo.animal.care { exports zoo.animal.care.medical; requires zoo.animal.feeding; }將行3修改如下。以後任何模組使用到模組zoo.animal.care都不需要在模組資訊檔內參照模組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原本如下:module zoo.staff { requires zoo.animal.feeding; requires zoo.animal.care; requires zoo.animal.talks; }簡化後可以去除兩個requires敘述:
module zoo.staff {
requires zoo.animal.talks;
}
沒有留言:
張貼留言