我最近不得不為 Kotlin 的編程課做一個練習。我們使用與 Java 課程相同的 JUnit 測驗,有時這會導致一些奇怪的問題。
在這種情況下,我們應該有一個帶有靜態方法的類,我們可以從另一個類訪問它。由于 Kotlin 中沒有靜態方法,我們將使用帶有 @JvmStatic 注釋的伴隨物件,如下所示:
companion object{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
這作業正常。然而,由于我真的不知道我在做什么,我最終將我的伴生物件命名為這樣:
companion object Parser{
@JvmStatic
fun parseRationalNumber[...]{
...}
}
一切仍然有效,但這最終破壞了我們的自動化 JUnit 測驗之一,該測驗將檢查我們是否正確解決了練習:
@Test
void testAllFieldsPrivate() {
Field[] fields = RationalNumber.class.getDeclaredFields();
for (Field field: fields) {
assertTrue(Modifier.isPrivate(field.getModifiers()) || "Companion".equals(field.getName()),
"The RationalNumber class should have only private instance variables.");
}
}
當我搜索非私有欄位時,這給了我很長時間的問題。最后,我對測驗進行了一些混亂,發現它有問題的欄位稱為“Parser”,這是我的伴生物件的名稱。
當我問我的教授為什么會發生這種情況時,他無法給我答案,所以我想我會在這里問。有誰知道為什么命名的伴隨物件被測驗為非私有欄位?
當我現在查看它時,該測驗似乎對名為“Companion”的伴隨物件進行了例外處理,我認為它是未命名伴隨物件的默認名稱。有人知道為什么這會作為非私人領域進行測驗嗎?
uj5u.com熱心網友回復:
僅僅因為任何未宣告為私有的欄位都不是私有的。伴生物件也不例外。你需要做
private companion object{
}
為了那個原因
uj5u.com熱心網友回復:
除非標記為私有,否則伴隨物件根本就不是私有的。
因此,該測驗實際上明確排除了伴隨物件,但它們以一種非常脆弱的方式進行。除了使用默認的“Companion”名稱,測驗還應該使用反射來獲取伴隨物件的實際名稱。
問題是測驗很可能使用 Java 反射,并且無法訪問它
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370981.html
