簡體   English   中英

如何在我可以在 Java 中調用 Enum.valueOf() 的內容中創建通用類?

[英]How to create a generic class in what I can call an Enum.valueOf() in Java?

所以我有這些課程:

public class DeviceInState implements MyInterface<Device> {

    private List<DeviceState> toStates(String statesString) {
        List<String> states = Lists.newArrayList(statesString.split(","));

        return states.stream().map(DeviceState::valueOf).collect(Collectors.toList());
    }
}

  
public class DeviceHistoryInState implements MyInterface<DeviceHistory> {
    private List<EventType> toStates(String statesString) {
        List<String> states = Lists.newArrayList(statesString.split(","));

        return states.stream().map(EventType::valueOf).collect(Collectors.toList());
    }
}

這些枚舉:

public enum EventType{
    NEW("N"), ACTIVE("A"), INACTIVE("I");
}
    
public enum DeviceState{
    REGISTRATED("R"), SUSPENDED("S"), DELETED("D");
}

區別在於:

  • DeviceInState implements MyInterface<Device> DeviceHistoryInState implements MyInterface<DeviceHistory>

  • DeviceState::valueOfDeviceInState被調用; EventTypes::valueOfDeviceHistoryInState被調用

我有幾個這樣的其他類,所以我想制作一個通用的類。 但我不知道這是否可能。 我如何以一種可以調用::valueOf方法的方式參數化我的類或方法?

提前致謝。

這就是我要做的……

public interface State< E extends Enum< E > > { … }

然后我的enums會實現......

…
public enum DeviceState implements State< DeviceState > { … }
…
public enum EventType implements State< EventType > { … }
…

……其實這些方法都沒有被覆蓋。 這些方法只是從被覆蓋的方法中調用……

考慮到您使用@Overrides注釋了代碼段中的方法,我發現這是一個非常令人困惑的評論。 為了讓我自己不那么困惑,我的實驗性實現確實覆蓋了一些東西......

public class DeviceInState extends ToStateable< DeviceState > implements Specification< Device > {

    @Override
    public List< DeviceState > toStates( String statesString ) {
        
        List< String > states = asList( statesString.split( "," ) );

        return states.stream( ).map( String::trim ).map( DeviceState::valueOf ).collect(Collectors.toList());
    }
}

我能夠成功地稱之為......

…
ToStateable< DeviceState > deviceToStateable = new DeviceInState( );
      
List< DeviceState > deviceStates = deviceToStateable.toStates( "SUSPENDED,REGISTERED,DELETED" );
      
ToStateable< EventType > eventToStateable = new DeviceHistoryInState( );
      
List< EventType > eventTypes = eventToStateable.toStates( "INACTIVE, NEW, ACTIVE"  );
…

打印出我能看到的那些物體……

                                  [SUSPENDED, REGISTERED, DELETED]
                                           [INACTIVE, NEW, ACTIVE]
                                                         SUSPENDED
                                             EXPERIMENT SUCCESSFUL

您可以在 DeviceHistoryInState 和 DeviceInState 中刪除兩個類似的toState()實現,並定義一個適用於任何枚舉類型的通用方法:

static <E extends Enum<E>> List<E> toStates(Class<E> cls, String statesString) {
    List<String> states = Arrays.asList(statesString.split(","));
    return states.stream().map(String::trim).map(s -> Enum.valueOf(cls, s))
                          .collect(Collectors.toList());
}

但是有一個小成本:您必須將 EnumType.class 作為參數傳遞,但這相當簡單:

List< DeviceState > devStates = toStates(DeviceState.class, "SUSPENDED,REGISTRATED,DELETED");
=> [SUSPENDED, REGISTRATED, DELETED]
List< EventType > evTypes = toStates(EventType.class, "INACTIVE,NEW,ACTIVE");
=>  [INACTIVE, NEW, ACTIVE]

或者,您可以對調用上述內容的 EventType.toState(String) 進行簡單定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM