亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果 Enum 是期望元素之一,請檢查 setter

如果 Enum 是期望元素之一,請檢查 setter

守候你守候我 2022-04-28 17:17:31
我想驗證傳遞給 setter 的參數。我有一個枚舉,在這個枚舉中我有一個汽車顏色。在設置器中,我想檢查傳入的參數是否是我的 Color 枚舉的一部分。我正在尋找任何枚舉方法,但我沒有找到任何方法。我嘗試使用正則表達式,但這不是一個好主意。public enum Color {  BLUE, RED, BLACK, WHITE}public void setColor(String color) {    //hear should be a method checking if a color contain enum    this.color = color;}我希望這個元素將包含一個枚舉。
查看完整描述

1 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

tl;博士

在設置器中,我想檢查傳入的參數是否是我的 Color 枚舉的一部分。

錯誤的做法。您應該傳遞一個 object,您的枚舉對象之一,而不是顏色名稱的文本。

請參見poster.setBackgroundColor( Color.GREEN )下面的示例。

這就是在 Java 中使用枚舉的要點:讓編譯器在編譯時檢查是否傳遞了有效值,而不是擔心在運行時驗證代碼。

細節

看起來你在混淆一些東西。您可能混淆了枚舉實例(一個常量)、它的硬編碼名稱以及您可能希望在運行時向用戶顯示的名稱。

AnEnum是一種方便地實例化預定數量的類實例的方法,每個實例都被分配一個預定的名稱。例如,Month,Month.JANUARY通過Month.DECEMBER

常數名稱

如果您想要實例的硬編碼名稱,按照約定全部大寫(作為常量),然后調用toString.

String constantName = Month.JANUARY.toString() ;

一月

這里要非常清楚:String帶有文本“JANUARY”的對象是由Month名為 的對象生成的JANUARY。客體和客體是完全分開和不同的。MonthString的文本String只是Month對象值的表示。

如果要通過該硬編碼實例名稱獲取常量,請調用valueOf.

Month m = Month.valueOf( "JANUARY" ) ;  // Returns a `Month` object, not text.

盡量不要養成習慣valueOf。調用valueOf破壞了 Java 中枚舉的目的和功能。您應該傳遞枚舉對象,而不是它們的名稱字符串。

顯示名稱

這些全大寫的英文值可能足以用于日志記錄和調試。但我們不太可能希望全大寫英文文本出現在我們的用戶界面和報告中。因此,在編寫自己的代碼時Enum,請添加一個名為類似的方法getDisplayName,如Month&所示DayOfWeek。指定TextStyle縮寫的長度,以及Locale翻譯中使用的人類語言和文化規范。

String output = m.getDisplayName( 
    TextStyle.FULL , 
    Locale.CANADA_FRENCH ) ;

揚維爾

如何在您自己的枚舉上實現它?好吧,您的枚舉實際上是Enum. 因此,您的枚舉實際上是一個與其他任何 Java 類一樣的 Java 類,因為它可以具有構造函數和方法。為每個聲明的枚舉實例名稱添加參數。

示例類

這是單個.java文件中的完整示例枚舉類,帶有main演示方法。

package work.basil.example;


import java.util.EnumSet;

import java.util.Set;


public enum Color {

    BLACK( "Black" ),                       // Pass arguments to each declared constant instant name, as you are really calling the constructor on each `static` `final` class constant object being automatically instantiated.

    GREY( "Grey" ),

    RED( "Red" ),

    GREEN( "Green" ),

    BLUE( "Blue" );


    private String displayName;             // Store the display name as a member variable on each enum instance.


    // Constructor     

    Color ( String displayName ) {          // Define a constructor taking the display name argument you passed above.

        this.displayName = displayName;

    }


    String getDisplayName ( ) {

        return this.displayName;

    }


    public static void main ( String[] args ) {

        System.out.println( "Color.BLACK.toString(): " + Color.BLACK.toString() );

        System.out.println( "Color.BLACK.getDisplayName(): " + Color.BLACK.getDisplayName() );


        Set < Color > monochromeColors = EnumSet.of( Color.BLACK , Color.GREY );

        boolean isRedMonochrome = monochromeColors.contains( Color.RED ); // ? false.

        System.out.println( "isRedMonochrome: " + isRedMonochrome );

    }

}

跑的時候。


Color.BLACK.toString(): 黑色


Color.BLACK.getDisplayName():黑色


isRedMonochrome: 假


注意使用EnumSet(or EnumMap) 來收集枚舉實例。這里我們定義了一個以黑色和灰色命名的Color對象集合,但忽略了紅色、綠色和藍色。SetmonochromeColors


要使用您的枚舉,請想象一個Poster具有海報背景顏色的 setter 方法的類。


Poster poster = new Poster() ;

poster.setBackgroundColor( Color.GREEN ) ;  

不需要文字 - 只需使用對象

請注意,沒有涉及文本。不需要實例名稱的字符串,也不需要顯示名稱。使用枚舉實例是關于使用對象,而不是文本,而不是String. 使用 enum 對象可確保值有效,提供類型安全性,并使您的代碼更具自我記錄性。


使用名稱

讓我們添加需要這些名稱的代碼。首先用于記錄,toString在Poster.


@Override public String toString() {

    return "Poster{ name=" + this.name + " | backgroundColor: " + this.backgroundColor.toString() + " }" ;  // Shows "GREEN"

}

在用戶界面中展示海報時,顯示顏色的名稱。


Label label = new Label( 

    "Background color: " + 

    poster.getBackgroundColor().getDisplayName()   // Shows "Green".

) ;


查看完整回答
反對 回復 2022-04-28
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號