Со временем капли воды и камни изнашиваются 😄
что такое перечисление
перечислениеJDK 1.5
Введена новая функция, которая состоит из фиксированного набора констант, составляющих тип допустимых значений, таких как время года, номер недели недели. Перечисления на самом деле являются специальными классами, которые наследуютjava.lang.Enum
Класс и реализацияjava.lang.Seriablizable
иjava.lang.Comparable
два интерфейса. Члены поля являются константами, а конструкторы по умолчанию закрыты.
Как определить перечисление
Давайте посмотрим, как определяются перечисления! Мы определяем четыре значения, которыеВесна лето осень зима.
public enum SeasonEnum {
//春天
SPRING,
//夏天
SUMMER,
//秋天
AUTUMN,
//冬天
WINTER;
}
Вышеупомянутый способ - это то, как определяется класс перечисления. Это просто! Затем давайте взглянем на функции, предоставляемые классом перечисления.
перечисленные функции
public static void main(String[] args) {
//1、根据传入的名称获得指定的枚举,可能会抛出异常
SeasonEnum autumn = SeasonEnum.valueOf("AUTUMN");
System.out.println("autumn1 = " + autumn);
//与 1、一致
SeasonEnum anEnum = SeasonEnum.valueOf(SeasonEnum.class, "AUTUMN");
System.out.println("autumn2 = " +anEnum);
//2、返回当前枚举类中的所有元素
SeasonEnum[] values = SeasonEnum.values();
System.out.println("values = " +Arrays.toString(values));
//3、获得枚举元素
SeasonEnum name1 = SeasonEnum.AUTUMN;
System.out.println("name1 = " + name1);
//获得枚举元素的名称
String name2 = SeasonEnum.AUTUMN.name();
System.out.println("name2 = " + name2);
//4、返回此枚举元素的索引,从 0 开始
int ordinal = SeasonEnum.AUTUMN.ordinal();
System.out.println("ordinal = " + ordinal);
//5、与指定的对象进行比较,返回一个负整数,零或正整数。
//小于指定对象返回 负整数
//等于指定对象返回 零
//大于指定对象 返回正整数
int i = SeasonEnum.AUTUMN.compareTo(SeasonEnum.AUTUMN);
System.out.println("compareTo = " + i);
//返回枚举类的类型
System.out.println("getDeclaringClass = " + SeasonEnum.AUTUMN.getDeclaringClass());
//如果指定的对象等于此枚举元素,则返回true。
System.out.println("equals = " + SeasonEnum.AUTUMN.equals("AUTUMN"));
}
结果:
autumn1 = AUTUMN
autumn2 = AUTUMN
values = [SPRING, SUMMER, AUTUMN, WINTER]
name1 = AUTUMN
name2 = AUTUMN
ordinal = 2
compareTo = 0
getDeclaringClass = class com.gongj.jsondate.controller.SeasonEnum
equals = false
использование перечисления
Это было кратко представлено вышеОпределение перечисленияиперечисляемые функции! Затем в этом разделе вы увидите, как использовать перечисление на работе и где его использовать!
1, определить константы
просто используйте вышеSeasonEnum
Класс перечисления.
public static void main(String[] args) {
SeasonEnum type = SeasonEnum.AUTUMN;
if(SPRING.equals(type)){
System.out.println("春天:春暖花开");
}
if(SUMMER.equals(type)){
System.out.println("夏天:夏阳酷暑");
}
if(AUTUMN.equals(type)){
System.out.println("秋天:秋风习习");
}
if(WINTER.equals(type)){
System.out.println("冬天:冬日暖阳");
}
}
结果:秋天:秋风习习
существуетif
,switch
Значение оператора суждения можно заменить перечислением, чтобы улучшить читаемость кода.
2. Прием параметров
Значение параметра запроса интерфейса можно получить перебором! НапримерOrderDTO
КатегорияorderType
Тип поля, вы можете использовать перечисление для получения! Что в этом хорошего?
- 1. Читабельность кода позволяет другим разработчикам с первого взгляда узнать, какие значения типа имеет тип заказа.
- 2. Уточнить объем типов заказов. Это может помешать пользователям передавать значения произвольно.
public class OrderDTO {
private Long id;
private String orderName;
private SeasonEnum orderType;
}
все еще использую здесьSeasonEnum
Класс перечисления для демонстрации.
Обеспечьте внешний интерфейс
@PostMapping("/save")
public void save(@RequestBody OrderDTO req){
System.out.println( JSON.toJSONString(req));
}
Затем звоните:http://localhost:8080/save
, в ответ на подсказкиvalue 不是声明的 Enum 实例名称之一
.
то естьorderType
значение, может быть толькоSeasonEnum
Экземпляр объявления класса перечисления.
3. Преобразование значения кода
Использование реализации класса перечисления может опустить многиеif/else
. Большинство из них используются для взаимодействия с различными системами, например: получение функции для взаимодействия с банком Процесс выглядит следующим образом:Front-end -> back-end этой системы -> вызвать интерфейс банка.один из нихСтатус платежакодовое значение. в собственной системе1- Подлежит оплате, пока в банке0 - к оплате. Значения кода между двумя системами несовместимы, поэтому в этой системе необходимо настроить правила преобразования. В это время вы можете использовать класс перечисления для реализации.
3.1, напишите базовый класс перечисления
Напишите базовый класс перечисления. Все классы перечисления должны реализовать этот интерфейс. Если базовый класс не соответствует требованиям, подклассы могут быть расширены по желанию.
Согласно исправлению большого парня в области комментариев,set方法
удалить., чтобы обеспечить одноэлементность перечисления, чтобы другие не могли изменить значение перечисления, вызывая проблемы в сети!
public interface BaseEnum {
String getKey();
String getValue();
String getDesc();
}
3.2, напишите класс перечисления платежей
выполнитьBaseEnum
интерфейс и расширить его самостоятельноchannel
,channelDesc
два поля и добавитьmatch
метод.
public enum PayEnum implements BaseEnum{
WAITING_PAY("1","0","待支付","unionpay","银联"),
SUCCESS_PAY("2","1","支付成功","unionpay","银联"),
FAIL_PAY("3","2","支付失败","unionpay","银联"),
ALIPAY_WAITING_PAY("1","3","待支付","alipay","支付宝");
private String key;
private String value;
private String desc;
//本类扩展字段 用于对接不同系统的支付状态
private String channel;
private String channelDesc;
private PayEnum(String key,String value,String desc,String channel,String channelDesc){
this.key = key;
this.value = value;
this.desc = desc;
this.channel = channel;
this.channelDesc = channelDesc;
}
@Override
public String getKey() {
return this.key;
}
@Override
public String getValue() {
return this.value;
}
@Override
public String getDesc() {
return this.desc;
}
public String getChannel() {
return channel;
}
public String getChannelDesc() {
return channelDesc;
}
/**
* 根据 key 和 channel 获得枚举实例
* @param key
* @param channel
* @return
*/
public static PayEnum match(String key, String channel) {
PayEnum[] enums = PayEnum.values();
for (PayEnum payEnum : enums) {
if (key.equals(payEnum.getKey()) && channel.equals(payEnum.getChannel()))
return payEnum;
}
return null;
}
}
3.3 Тест
public static void main(String[] args) {
String key = "1";
String channel = "unionpay";
PayEnum match = match(key, channel);
System.out.println(match.getKey() + "==" + match.getValue()
+ "===" + match.getDesc() + "===" +
"==" + match.getChannel());
}
结果:1==0===待支付=====unionpay
Использование перечислений в некоторых случаях может упустить многоif/else
.
- Если у вас есть какие-либо вопросы по этой статье или есть ошибки в этой статье, пожалуйста, оставьте комментарий. Если вы считаете, что эта статья была вам полезна, ставьте лайк и подписывайтесь на нее.