枚举类型(enum)

今天在查看android 计算器源码的过程中发现,谷歌的程序员在定义计算器的工作状态时,使用的是一个枚举类型

private enum CalculatorState {    INPUT, EVALUATE, RESULT, ERROR}

最初我对枚举类型的理解仅仅是一个表达选择内容的类型,因为可以使用private static final int ... = ...的形式代替,也就没有细看,今天系统的学习一下;

枚举类型简单的应用场景

在类的对象有限且固定的时候,可以使用枚举类,比如说:

private enum SexEnumTest {    MALE,FEMAL}/*private static final int MALE = 1;private static final int FEMALE = 2;*/private enum SeasonEnumTest {    SPRING,SUMMER,FALL,WINTER}/*private static final int SPRING = 1;private static final int SUMMER = 2;private static final int FALL = 3;private static final int WINTER = 4;*/

比如说当前判断完小明是男生或者当前季节是春天时,我们可以对上述枚举类型中的值进行一个get方法,这样的定义快速有效并且简洁、可读性高

public enum SexEnum {  MALE("male"),FEMALE("female");  private final String strings;  SexEnum(String strings){    this.strings = strings;  }  public String getStrings(){    return this.strings;  }}public enum SeasonEnum {    SPRING("spring"),SUMMER("summer"),FALL("fall"),WINTER("winter");    private final String nowSeason;    SeasonEnum (String s){        this.nowSeason = s;    }    public String getNowSeason(){        return this.nowSeason;    }}public static void main(String[] args) {     SexEnum xiaoMing = SexEnum.MALE;     System.out.println(xiaoMing.getStrings());     SeasonEnum nowSeason = SeasonEnum.SPRING;     System.out.println(nowSeason.getNowSeason()); }

枚举类型的简单使用实例

下面我们模拟一个android中经常遇到的一个情况:
在主界面上有一个TextView,三个Button,初始情况TextView中显示的是"init状态",当用户点击Button时Toast会提示依次改变显示状态"red"“green”"blue"要求涉及到枚举类型,使用Button的点击事件去设置当前的显示状态.
界面布局文件的代码:

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"    android:orientation="vertical">    <TextView        android:id="@+id/showText"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="init"        android:textSize="80sp"        android:layout_gravity="center"        android:layout_marginTop="30dp"        android:textColor="@color/colorPrimaryDark" />    <Button        android:id="@+id/btnRed"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="Red"        android:textSize="30sp"        android:layout_margin="30dp"        android:onClick="changeState"/>    <Button        android:id="@+id/btnBlue"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="Blue"        android:textSize="30sp"        android:layout_marginLeft="30dp"        android:layout_marginRight="30dp"        android:onClick="changeState"/>    <Button        android:id="@+id/btnGreen"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textAllCaps="false"        android:text="Green"        android:textSize="30sp"        android:layout_marginTop="30dp"        android:layout_marginLeft="30dp"        android:layout_marginRight="30dp"        android:onClick="changeState"/>LinearLayout>

主函数部分的代码:

import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    public colorState nowState;    public TextView showText;    public Button btnRed;    public Button btnGreen;    public Button btnBlue;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bind();        init();    }    public void changeState(View view) {        //点击事件        switch (view.getId()){            case R.id.btnBlue:                setNowState(colorState.BLUE);                Toast.makeText(this,"change state to blue", Toast.LENGTH_LONG).show();                break;            case R.id.btnGreen:                setNowState(colorState.GREEN);                Toast.makeText(this, "change state to green",Toast.LENGTH_LONG).show();                break;            case R.id.btnRed:                setNowState(colorState.RED);                Toast.makeText(this, "change state to red", Toast.LENGTH_LONG).show();                break;            default:                break;        }    }    private enum colorState{        //枚举类        INIT,RED,GREEN,BLUE    }    public void setNowState(colorState State) {        switch (State){            case RED:                nowState = colorState.RED;                showText.setText("Red");                break;            case BLUE:                nowState = colorState.BLUE;                showText.setText("Blue");                break;            case INIT:                nowState = colorState.INIT;                break;            case GREEN:                nowState = colorState.GREEN;                showText.setText("Green");                break;            default:                break;        }    }    public void bind(){        //查询控件        showText = findViewById(R.id.showText);        btnBlue = findViewById(R.id.btnBlue);        btnGreen = findViewById(R.id.btnGreen);        btnRed = findViewById(R.id.btnRed);    }    public void init(){        //初始化        setNowState(colorState.INIT);        showText.setText("Init");    }}

包含抽象方法的枚举类型

掌握上述的例子,这部分就很容易理解了,我们在创建枚举类型时,除了可以设置枚举类型对应的值,也可以设置对应的方法,例如:

public enum meetEnum {    xiaofang {        public String meet(String place){            return "xiao ming meet xiao fang in " + place;        }    },    xiaohong {        public String meet(String place){            return "xiao ming meet xiao hong in " + place;        }    };    public abstract String meet(String place);}public class EnumTest {    public static void main(String[] args) {        System.out.println(meetEnum.xiaofang.meet("School"));        System.out.println(meetEnum.xiaohong.meet("Street"));    }}//控制台打印信息:xiao ming meet xiao fang in Schoolxiao ming meet xiao hong in Street

这里注意需要使用abstract关键字定义一个抽象方法,才可以在主函数中调用。定义枚举类型时不可以使用abstract关键字,因为枚举类型需要显示创建,所以定义每个枚举值时都必须为抽象方法提供实现!

实现接口的枚举类型

上述表面枚举类型是可以实现方法的,那么也就是说枚举类型可以实现接口方法。这里我也就不多说了,无非就是上述例子中的meet(String Place)函数成为了某个接口定义的方法.

更多相关文章

  1. android 登陆、提交数据或加载数据时提示页面
  2. Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程
  3. 第一行代码 Android读书笔记(一)
  4. Testing和Instrumentation
  5. Android(安卓)触控事件解析(Mastering the Android(安卓)Touch Sy
  6. Android异步消息机制
  7. Android(安卓)Activity生命周期详解
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android系统Surface机制的SurfaceFlinger
  2. android之视频播放
  3. Android中drawable使用Shape资源
  4. Android:创建窗口式Activity
  5. 初始化有EditText或AutoCompleteEditText
  6. MPAndroidChart项目实战(七)——自定义横向
  7. android开发视频教程 android培训入门教
  8. Android多屏幕适配之字体大小、行间距和
  9. 关于android中的gif实现
  10. Android:Camera2开发详解(上):实现预览、