在我之前的文章「在自訂註解中使用雜湊映射」中,我解釋瞭如何使用枚舉常數在註解中使用HashMap。
巢狀註解也可以用來映射鍵值對。
註解中支援的類型清單
需要兩個自訂註解。第一個註解(例如MapItem)包含一個鍵值對,第二個註解(例如MapItems)包含一個MapItem註解清單。
註解@MapItem表示單一鍵值對。
<code class="language-java">@Target(ElementType.FIELD) public @interface MapItem { String key(); String value(); }</code>
註解@MapItems定義了一個MapItem清單。
<code class="language-java">@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MapItems { MapItem[] items(); }</code>
@MapItem註解清單設定在@MapItems註解中。
<code class="language-java">class ExampleDto { @MapItems(items = { @MapItem(key = "1", value = "MALE"), @MapItem(key = "2", value = "FEMALE"), @MapItem(key = "6", value = "DIVERS") }) public String salutation; }</code>
MapItemsTest測試MapItems註解。測試在salutation字段上進行。
為了示範如何使用@MapItem列表,我從@MapItem建立一個HashMap,與預期的HashMap進行比較。
<code class="language-java">class MapItemsTest { @Test void testMapItems() throws NoSuchFieldException { Field field = ExampleDto.class.getDeclaredField("salutation"); field.setAccessible(true); MapItems annotation = field.getAnnotation(MapItems.class); Map<String, String> mappingItems = Arrays .stream(annotation.items()) .collect( Collectors.toMap( MapItem::key, MapItem::value ) ); assertEquals( new HashMap<>() {{ put("1", "MALE"); put("2", "FEMALE"); put("6", "DIVERS"); }}, mappingItems ); } }</code>
這是一個巧妙的解決方案,很容易實現。
例如,如果鍵值對要在驗證器中使用,則必須間接取得它們。
https://www.php.cn/link/164710e8521a5b39302f816392f05bc2
以上是在自訂註釋中對鍵值對使用嵌套註釋的詳細內容。更多資訊請關注PHP中文網其他相關文章!