0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

看看人家在接口中使用枚舉類(lèi)型的方式

jf_ro2CN3Fa ? 來(lái)源:geekhalo ? 2023-02-24 13:59 ? 次閱讀

1. 概覽

枚舉作為 Java 5 的重要特征,相信大家并不陌生,但在實(shí)際開(kāi)發(fā)過(guò)程中,當(dāng) name 和 ordrial 發(fā)生變化時(shí),如果處理不當(dāng)非常容易引起系統(tǒng)bug。這種兼容性bug非常難以定位,需要從框架層次進(jìn)行避免,而非僅靠開(kāi)發(fā)人員的主觀意識(shí)。

1.1. 背景

枚舉很好用,特別是提供的 name 和 ordrial 特性,但這點(diǎn)對(duì)重構(gòu)造成了一定影響,比如:

某個(gè)枚舉值業(yè)務(wù)語(yǔ)義發(fā)生變化,需要將其進(jìn)行 rename 操作,以更好的表達(dá)新業(yè)務(wù)語(yǔ)義

新增、刪除或者為了展示調(diào)整了枚舉定義順序

這些在業(yè)務(wù)開(kāi)發(fā)中非常常見(jiàn),使用 IDE 的 refactor 功能可以快速且準(zhǔn)確的完成重構(gòu)工作。但,如果系統(tǒng)將這些暴露出去或者存儲(chǔ)到數(shù)據(jù)庫(kù)等存儲(chǔ)引擎就變得非常麻煩,不管是 name 還是 ordrial 的變更都會(huì)產(chǎn)生兼容性問(wèn)題。

對(duì)此,最常見(jiàn)的解決方案便是放棄使用 name 和 ordrial,轉(zhuǎn)而使用控制能力更強(qiáng)的 code。

1.2. 目標(biāo)

提供一組工具,以方便的基于 code 使用枚舉,快速完成對(duì)現(xiàn)有框架的集成:

完成與 Spring MVC 的集成,基于 code 使用枚舉;加強(qiáng)返回值,以對(duì)象的方式進(jìn)行返回,信息包括 code、name、description

提供統(tǒng)一的枚舉字典,自動(dòng)掃描系統(tǒng)中的枚舉并將其以 restful 的方式暴露給前端

使用 code 進(jìn)行數(shù)據(jù)存儲(chǔ)操作,避免重構(gòu)的影響

2. 快速入門(mén)

2.1. 添加 starter

在 Spring boot 項(xiàng)目的 pom 中增加如下依賴:

com.geekhalo.lego
lego-starter
0.1.19-enum-SNAPSHOT

2.2. 統(tǒng)一枚舉結(jié)構(gòu)

如何統(tǒng)一枚舉行為呢?公共父類(lèi)肯定是不行的,但可以為其提供一個(gè)接口,在接口中完成行為的定義。

2.2.1. 定義枚舉接口

除了在枚舉中自定義 code 外,通常還會(huì)為其提供描述信息,構(gòu)建接口如下:

publicinterfaceCodeBasedEnum{
intgetCode();
}
publicinterfaceSelfDescribedEnum{
defaultStringgetName(){
returnname();
}

Stringname();

StringgetDescription();
}
publicinterfaceCommonEnumextendsCodeBasedEnum,SelfDescribedEnum{

}

整體結(jié)構(gòu)如下:

7cabccf2-b37f-11ed-bfe3-dac502259ad0.png

在定義枚舉時(shí)便可以直接使用CommonEnum這個(gè)接口。

2.2.2. 實(shí)現(xiàn)枚舉接口

有了統(tǒng)一的枚舉接口,在定義枚舉時(shí)便可以直接實(shí)現(xiàn)接口,從而完成對(duì)枚舉的約束。

publicenumNewsStatusimplementsCommonEnum{
DELETE(1,"刪除"),
ONLINE(10,"上線"),
OFFLINE(20,"下線");
privatefinalintcode;
privatefinalStringdesc;

NewsStatus(intcode,Stringdesc){
this.code=code;
this.desc=desc;
}

@Override
publicintgetCode(){
returnthis.code;
}

@Override
publicStringgetDescription(){
returnthis.desc;
}
}

2.3. 自動(dòng)注冊(cè) CommonEnum

有了統(tǒng)一的 CommonEnum 最大的好處便是可以進(jìn)行統(tǒng)一管理,對(duì)于統(tǒng)一管理,第一件事便是找到并注冊(cè)所有的 CommonEnum。

7cbbd3d6-b37f-11ed-bfe3-dac502259ad0.png

以上是核心處理流程:

首先通過(guò) Spring 的 ResourcePatternResolver 根據(jù)配置的 basePackage 對(duì)classpath進(jìn)行掃描

掃描結(jié)果以Resource來(lái)表示,通過(guò) MetadataReader 讀取 Resource 信息,并將其解析為 ClassMetadata

獲得 ClassMetadata 之后,找出實(shí)現(xiàn) CommonEnum 的類(lèi)

將 CommonEnum 實(shí)現(xiàn)類(lèi)注冊(cè)到兩個(gè) Map 中進(jìn)行緩存

備注:此處萬(wàn)萬(wàn)不可直接使用反射技術(shù),反射會(huì)觸發(fā)類(lèi)的自動(dòng)加載,將對(duì)眾多不需要的類(lèi)進(jìn)行加載,從而增加 metaspace 的壓力。

在需要 CommonEnum 時(shí),只需注入 CommonEnumRegistry Bean 便可以方便的獲得 CommonEnum 的具體實(shí)現(xiàn)。

2.4. Spring MVC 接入層

Web 層是最常見(jiàn)的接入點(diǎn),對(duì)于 CommonEnum 我們傾向于:

參數(shù)使用 code 來(lái)表示,避免 name、ordrial 變化導(dǎo)致業(yè)務(wù)異常

豐富返回值,包括枚舉的 code、name、description 等

7ce61fba-b37f-11ed-bfe3-dac502259ad0.png

2.4.1. 入?yún)⑥D(zhuǎn)化

Spring MVC 存在兩種參數(shù)轉(zhuǎn)化擴(kuò)展:

對(duì)于普通參數(shù),比如 RequestParam 或 PathVariable 直接從 ConditionalGenericConverter 進(jìn)行擴(kuò)展

基于 CommonEnumRegistry 提供的 CommonEnum 信息,對(duì) matches 和 getConvertibleTypes方法進(jìn)行重寫(xiě)

根據(jù)目標(biāo)類(lèi)型獲取所有的 枚舉值,并根據(jù) code 和 name 進(jìn)行轉(zhuǎn)化

對(duì)于 Json 參數(shù),需要對(duì) Json 框架進(jìn)行擴(kuò)展(以 Jackson 為例)

遍歷 CommonEnumRegistry 提供的所有 CommonEnum,依次進(jìn)行注冊(cè)

從 Json 中讀取信息,根據(jù) code 和 name 轉(zhuǎn)化為確定的枚舉值

兩種擴(kuò)展核心實(shí)現(xiàn)見(jiàn):

@Order(1)
@Component
publicclassCommonEnumConverterimplementsConditionalGenericConverter{
@Autowired
privateCommonEnumRegistryenumRegistry;

@Override
publicbooleanmatches(TypeDescriptorsourceType,TypeDescriptortargetType){
Classtype=targetType.getType();
returnenumRegistry.getClassDict().containsKey(type);
}

@Override
publicSetgetConvertibleTypes(){
returnenumRegistry.getClassDict().keySet().stream()
.map(cls->newConvertiblePair(String.class,cls))
.collect(Collectors.toSet());
}

@Override
publicObjectconvert(Objectsource,TypeDescriptorsourceType,TypeDescriptortargetType){
Stringvalue=(String)source;
ListcommonEnums=this.enumRegistry.getClassDict().get(targetType.getType());
returncommonEnums.stream()
.filter(commonEnum->commonEnum.match(value))
.findFirst()
.orElse(null);
}
}

staticclassCommonEnumJsonDeserializerextendsJsonDeserializer{
privatefinalListcommonEnums;

CommonEnumJsonDeserializer(ListcommonEnums){
this.commonEnums=commonEnums;
}

@Override
publicObjectdeserialize(JsonParserjsonParser,DeserializationContextdeserializationContext)throwsIOException,JacksonException{
Stringvalue=jsonParser.readValueAs(String.class);
returncommonEnums.stream()
.filter(commonEnum->commonEnum.match(value))
.findFirst()
.orElse(null);
}
}

2.4.2. 增強(qiáng)返回值

默認(rèn)情況下,對(duì)于枚舉類(lèi)型在轉(zhuǎn)換為 Json 時(shí),只會(huì)輸出 name,其他信息會(huì)出現(xiàn)丟失,對(duì)于展示非常不友好,對(duì)此,需要對(duì) Json 序列化進(jìn)行能力增強(qiáng)。

首先,需要定義 CommonEnum 對(duì)應(yīng)的返回對(duì)象,具體如下:

@Value
@AllArgsConstructor(access=AccessLevel.PRIVATE)
@ApiModel(description="通用枚舉")
publicclassCommonEnumVO{
@ApiModelProperty(notes="Code")
privatefinalintcode;

@ApiModelProperty(notes="Name")
privatefinalStringname;

@ApiModelProperty(notes="描述")
privatefinalStringdesc;

publicstaticCommonEnumVOfrom(CommonEnumcommonEnum){
if(commonEnum==null){
returnnull;
}
returnnewCommonEnumVO(commonEnum.getCode(),commonEnum.getName(),commonEnum.getDescription());
}

publicstaticListfrom(ListcommonEnums){
if(CollectionUtils.isEmpty(commonEnums)){
returnCollections.emptyList();
}
returncommonEnums.stream()
.filter(Objects::nonNull)
.map(CommonEnumVO::from)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}

CommonEnumVO 是一個(gè)標(biāo)準(zhǔn)的 POJO,只是增加了 Swagger 相關(guān)注解。

CommonEnumJsonSerializer 是自定義序列化的核心,會(huì)將 CommonEnum 封裝為 CommonEnumVO 并進(jìn)行寫(xiě)回,具體如下:

staticclassCommonEnumJsonSerializerextendsJsonSerializer{

@Override
publicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{
CommonEnumcommonEnum=(CommonEnum)o;
CommonEnumVOcommonEnumVO=CommonEnumVO.from(commonEnum);
jsonGenerator.writeObject(commonEnumVO);
}
}

2.4.3. 效果展示

首先,新建一個(gè)測(cè)試枚舉 NewsStatus,具體如下:

publicenumNewsStatusimplementsCommonEnum{
DELETE(1,"刪除"),
ONLINE(10,"上線"),
OFFLINE(20,"下線");
privatefinalintcode;
privatefinalStringdesc;

NewsStatus(intcode,Stringdesc){
this.code=code;
this.desc=desc;
}

@Override
publicintgetCode(){
returnthis.code;
}

@Override
publicStringgetDescription(){
returnthis.desc;
}
}

然后新建 EnumController,具體如下:

@RestController
@RequestMapping("enum")
publicclassEnumController{
@GetMapping("paramToEnum")
publicRestResultparamToEnum(@RequestParam("newsStatus")NewsStatusnewsStatus){
returnRestResult.success(CommonEnumVO.from(newsStatus));
}

@GetMapping("pathToEnum/{newsStatus}")
publicRestResultpathToEnum(@PathVariable("newsStatus")NewsStatusnewsStatus){
returnRestResult.success(CommonEnumVO.from(newsStatus));
}

@PostMapping("jsonToEnum")
publicRestResultjsonToEnum(@RequestBodyNewsStatusRequestBodynewsStatusRequestBody){
returnRestResult.success(CommonEnumVO.from(newsStatusRequestBody.getNewsStatus()));
}

@GetMapping("bodyToJson")
publicRestResultbodyToJson(){
NewsStatusResponseBodynewsStatusResponseBody=newNewsStatusResponseBody();
newsStatusResponseBody.setNewsStatus(Arrays.asList(NewsStatus.values()));
returnRestResult.success(newsStatusResponseBody);
}

@Data
publicstaticclassNewsStatusRequestBody{
privateNewsStatusnewsStatus;
}

@Data
publicstaticclassNewsStatusResponseBody{
privateListnewsStatus;
}
}

執(zhí)行結(jié)果如下:

7d89d560-b37f-11ed-bfe3-dac502259ad0.png

整體符合預(yù)期:

使用 code 作為請(qǐng)求參數(shù)可以自動(dòng)轉(zhuǎn)化為對(duì)應(yīng)的 CommonEnum

使用 CommonEnum 作為返回值,返回標(biāo)準(zhǔn)的 CommonEnumVO 對(duì)象結(jié)構(gòu)

2.5. 通用枚舉字典接口

有時(shí)可以將 枚舉 理解為系統(tǒng)的一類(lèi)字段,比較典型的就是管理頁(yè)面的各種下拉框,下拉框中的數(shù)據(jù)來(lái)自于后臺(tái)服務(wù)。

有了 CommonEnum 之后,可以提供統(tǒng)一的一組枚舉字典,避免重復(fù)開(kāi)發(fā),同時(shí)在新增枚舉時(shí)也無(wú)需進(jìn)行擴(kuò)展,系統(tǒng)自動(dòng)識(shí)別并添加到字典中。

2.5.1. 構(gòu)建字典Controller

在 CommonEnumRegistry 基礎(chǔ)之上實(shí)現(xiàn)通用字典接口非常簡(jiǎn)單,只需按規(guī)范構(gòu)建 Controller 即可,具體如下:

@Api(tags="通用字典接口")
@RestController
@RequestMapping("/enumDict")
@Slf4j
publicclassEnumDictController{
@Autowired
privateCommonEnumRegistrycommonEnumRegistry;

@GetMapping("all")
publicRestResult>>allEnums(){
Map>dict=this.commonEnumRegistry.getNameDict();
Map>dictVo=Maps.newHashMapWithExpectedSize(dict.size());
for(Map.Entry>entry:dict.entrySet()){
dictVo.put(entry.getKey(),CommonEnumVO.from(entry.getValue()));
}
returnRestResult.success(dictVo);
}

@GetMapping("types")
publicRestResult>enumTypes(){
Map>dict=this.commonEnumRegistry.getNameDict();
returnRestResult.success(Lists.newArrayList(dict.keySet()));
}

@GetMapping("/{type}")
publicRestResult>dictByType(@PathVariable("type")Stringtype){
Map>dict=this.commonEnumRegistry.getNameDict();
ListcommonEnums=dict.get(type);

returnRestResult.success(CommonEnumVO.from(commonEnums));
}
}

該 Controller 提供如下能力:

獲取全部字典,一次性獲取系統(tǒng)中所有的 CommonEnum

獲取所有字典類(lèi)型,僅獲取字典類(lèi)型,通常用于測(cè)試

獲取指定字典類(lèi)型的全部信息,比如上述所說(shuō)的填充下拉框

2.5.2. 效果展示

獲取全部字典:

7e020882-b37f-11ed-bfe3-dac502259ad0.png

獲取所有字典類(lèi)型:

7e15eece-b37f-11ed-bfe3-dac502259ad0.png

獲取指定字段類(lèi)型的全部信息:

7e2409d2-b37f-11ed-bfe3-dac502259ad0.png

2.6. 輸出適配器

輸出適配器主要以 ORM 框架為主,同時(shí)各類(lèi) ORM 框架均提供了類(lèi)型映射的擴(kuò)展點(diǎn),通過(guò)該擴(kuò)展點(diǎn)可以對(duì) CommonEnum 使用 code 進(jìn)行存儲(chǔ)。

2.6.1. MyBatis 支持

MyBatis 作為最流行的 ORM 框架,提供了 TypeHandler 用于處理自定義的類(lèi)型擴(kuò)展。

@MappedTypes(NewsStatus.class)
publicclassMyBatisNewsStatusHandlerextendsCommonEnumTypeHandler{
publicMyBatisNewsStatusHandler(){
super(NewsStatus.values());
}
}

MyBatisNewsStatusHandler 通過(guò) @MappedTypes(NewsStatus.class) 對(duì)其進(jìn)行標(biāo)記,以告知框架該 Handler 是用于 NewsStatus 類(lèi)型的轉(zhuǎn)換。

CommonEnumTypeHandler 是為 CommonEnum 提供的通用轉(zhuǎn)化能力,具體如下:

publicabstractclassCommonEnumTypeHandler&CommonEnum>
extendsBaseTypeHandler{
privatefinalListcommonEnums;

protectedCommonEnumTypeHandler(T[]commonEnums){
this(Arrays.asList(commonEnums));
}

protectedCommonEnumTypeHandler(ListcommonEnums){
this.commonEnums=commonEnums;
}

@Override
publicvoidsetNonNullParameter(PreparedStatementpreparedStatement,inti,Tt,JdbcTypejdbcType)throwsSQLException{
preparedStatement.setInt(i,t.getCode());
}

@Override
publicTgetNullableResult(ResultSetresultSet,StringcolumnName)throwsSQLException{

intcode=resultSet.getInt(columnName);
returncommonEnums.stream()
.filter(commonEnum->commonEnum.match(String.valueOf(code)))
.findFirst()
.orElse(null);
}

@Override
publicTgetNullableResult(ResultSetresultSet,inti)throwsSQLException{
intcode=resultSet.getInt(i);
returncommonEnums.stream()
.filter(commonEnum->commonEnum.match(String.valueOf(code)))
.findFirst()
.orElse(null);
}

@Override
publicTgetNullableResult(CallableStatementcallableStatement,inti)throwsSQLException{
intcode=callableStatement.getInt(i);
returncommonEnums.stream()
.filter(commonEnum->commonEnum.match(String.valueOf(code)))
.findFirst()
.orElse(null);
}
}

由于邏輯比較簡(jiǎn)單,在此不做過(guò)多解釋。

有了類(lèi)型之后,需要在 spring boot 的配置文件中指定 type-handler 的加載邏輯,具體如下:

mybatis:
type-handlers-package:com.geekhalo.lego.enums.mybatis

完成配置后,使用 Mapper 對(duì)數(shù)據(jù)進(jìn)行持久化,數(shù)據(jù)表中存儲(chǔ)的便是 code 信息,具體如下:

7e326b76-b37f-11ed-bfe3-dac502259ad0.png

2.6.2. JPA 支持

隨著 Spring data 越來(lái)越流行,JPA 又煥發(fā)出新的活力,JPA 提供 AttributeConverter 以對(duì)屬性轉(zhuǎn)換進(jìn)行自定義。

首先,構(gòu)建 JpaNewsStatusConverter,具體如下:

publicclassJpaNewsStatusConverterextendsCommonEnumAttributeConverter{
publicJpaNewsStatusConverter(){
super(NewsStatus.values());
}
}

CommonEnumAttributeConverter 為 CommonEnum 提供的通用轉(zhuǎn)化能力,具體如下:

publicabstractclassCommonEnumAttributeConverter&CommonEnum>
implementsAttributeConverter{
privatefinalListcommonEnums;

publicCommonEnumAttributeConverter(E[]commonEnums){
this(Arrays.asList(commonEnums));
}

publicCommonEnumAttributeConverter(ListcommonEnums){
this.commonEnums=commonEnums;
}

@Override
publicIntegerconvertToDatabaseColumn(Ee){
returne.getCode();
}

@Override
publicEconvertToEntityAttribute(Integercode){
return(E)commonEnums.stream()
.filter(commonEnum->commonEnum.match(String.valueOf(code)))
.findFirst()
.orElse(null);
}
}

在有了 JpaNewsStatusConverter 之后,我們需要在 Entity 的屬性上增加配置信息,具體如下:

@Entity
@Data
@Table(name="t_jpa_news")
publicclassJpaNewsEntity{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
privateLongid;

@Convert(converter=JpaNewsStatusConverter.class)
privateNewsStatusstatus;
}

@Convert(converter = JpaNewsStatusConverter.class) 是對(duì) status 的配置,使用 JpaNewsStatusConverter 進(jìn)行屬性的轉(zhuǎn)換。

運(yùn)行持久化指令后,數(shù)據(jù)庫(kù)如下:

7e45c996-b37f-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1957

    瀏覽量

    68088
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2971

    瀏覽量

    104853
  • MVC
    MVC
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    13880
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    119

    瀏覽量

    6981

原文標(biāo)題:看看人家在接口中使用枚舉類(lèi)型的方式,那叫一個(gè)優(yōu)雅!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用枚舉類(lèi)型表示狀態(tài)機(jī)進(jìn)入死循環(huán)

    定義狀態(tài)機(jī)中的狀態(tài)時(shí),除了可以使用宏(define)或者參數(shù)(parameter)聲明定義外,還可以使用枚舉類(lèi)型
    的頭像 發(fā)表于 11-07 17:46 ?1013次閱讀
    使用<b class='flag-5'>枚舉</b><b class='flag-5'>類(lèi)型</b>表示狀態(tài)機(jī)進(jìn)入死循環(huán)

    詳細(xì)講解c語(yǔ)言enum枚舉類(lèi)型

    詳細(xì)講解C語(yǔ)言enum枚舉類(lèi)型實(shí)際應(yīng)用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。 C 語(yǔ)言中對(duì)這樣取值比較特殊的變量可以定義為
    發(fā)表于 12-21 23:22

    枚舉類(lèi)型最后面增加項(xiàng)報(bào)錯(cuò)

    各位大神:我的枚舉類(lèi)型RadioState,最后面增加一項(xiàng),之后程序中很多用到RadioState的地方報(bào)錯(cuò),這個(gè)是什么原因造成的?下圖是我沒(méi)有改之前的枚舉
    發(fā)表于 05-15 12:02

    枚舉enum的使用

    }SysError_TypeDef;//創(chuàng)建一個(gè)枚舉變量就可以這樣SysError_TypeDefSysError;個(gè)人比較喜歡第三種方式。另外就是使用過(guò)程中,遇到這樣一個(gè)情況。要列舉出系統(tǒng)錯(cuò)誤
    發(fā)表于 02-06 15:09

    深入理解java枚舉類(lèi)型enum用法

    enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我使用 enum 過(guò)程中的一些經(jīng)驗(yàn)和總結(jié)。 原始的接口定義常量
    發(fā)表于 09-27 11:49 ?0次下載

    枚舉是C語(yǔ)言中的一種基本數(shù)據(jù)類(lèi)型

    C語(yǔ)言中,枚舉類(lèi)型是被當(dāng)做 int 或者 unsigned int 類(lèi)型來(lái)處理的,所以按照 C 語(yǔ)言規(guī)范是沒(méi)有辦法遍歷枚舉
    的頭像 發(fā)表于 09-25 15:45 ?8669次閱讀
    <b class='flag-5'>枚舉</b>是C語(yǔ)言中的一種基本數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>

    go語(yǔ)言枚舉類(lèi)型怎么用

    go 語(yǔ)言枚舉類(lèi)型是這么用的?什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語(yǔ)言枚舉做了詳細(xì)講解。 枚舉
    的頭像 發(fā)表于 09-02 09:43 ?5193次閱讀

    數(shù)字硬件建模SystemVerilog-枚舉數(shù)據(jù)類(lèi)型

    上一節(jié)介紹了已經(jīng)被淘汰的$unit聲明空間,今天我們來(lái)看看一種重要的數(shù)據(jù)類(lèi)型-枚舉數(shù)據(jù)類(lèi)型。
    的頭像 發(fā)表于 07-01 17:44 ?1772次閱讀

    SystemVerilog中枚舉類(lèi)型的使用建議

    SystemVerilog中枚舉類(lèi)型雖然屬于一種“強(qiáng)類(lèi)型”,但是枚舉類(lèi)型還是提供了一些“不正經(jīng)”的用法可以實(shí)現(xiàn)一些很常見(jiàn)的功能,本文將示例一
    的頭像 發(fā)表于 09-01 14:20 ?1732次閱讀

    淺析SystemVerilog中的枚舉類(lèi)型

    枚舉類(lèi)型定義了一組具有名稱的值,沒(méi)有指定值時(shí)默認(rèn)是int型數(shù)值。
    的頭像 發(fā)表于 10-13 09:44 ?1653次閱讀

    枚舉類(lèi)型的簡(jiǎn)單擴(kuò)展學(xué)習(xí)

    定義枚舉類(lèi)型的值只能是整型常量,正數(shù)、負(fù)數(shù)和零都可以,但不可以是浮點(diǎn)數(shù)
    的頭像 發(fā)表于 05-25 15:45 ?662次閱讀

    接口中的有效數(shù)據(jù)類(lèi)型和布局

    接口中包含有塊所用局部變量和局部常量的聲明。這些變量可分為以下兩組。
    的頭像 發(fā)表于 06-10 11:33 ?1020次閱讀
    塊<b class='flag-5'>接口中</b>的有效數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>和布局

    Java枚舉的特點(diǎn)及用法

    Java 枚舉出現(xiàn)之前,通常會(huì)使用常量類(lèi)來(lái)表示一組固定的常量值,直到Java 1.5之后推出了枚舉,那么枚舉類(lèi)型有哪些特點(diǎn),它比常量類(lèi)又
    的頭像 發(fā)表于 09-30 10:02 ?1497次閱讀

    java switch case值能為枚舉值嗎

    Java中的switch語(yǔ)句可以接受枚舉類(lèi)型的值作為參數(shù)。Java中,枚舉是一種特殊的數(shù)據(jù)類(lèi)型,它定義了一個(gè)固定數(shù)量的命名常量。因此,可以
    的頭像 發(fā)表于 11-30 14:41 ?5470次閱讀

    枚舉有多大?c語(yǔ)言枚舉end的作用是什么?

    枚舉有多大?c語(yǔ)言枚舉end的作用是什么? 枚舉C語(yǔ)言中是一種常見(jiàn)的數(shù)據(jù)類(lèi)型,用于定義一組相互關(guān)聯(lián)的常量或者變量。它通常用于表示一系列可能
    的頭像 發(fā)表于 01-19 14:19 ?629次閱讀