今天在查看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 School
xiao ming meet xiao hong in Street
这里注意需要使用abstract关键字定义一个抽象方法,才可以在主函数中调用。定义枚举类型时不可以使用abstract关键字,因为枚举类型需要显示创建,所以定义每个枚举值时都必须为抽象方法提供实现!
上述表面枚举类型是可以实现方法的,那么也就是说枚举类型可以实现接口方法。这里我也就不多说了,无非就是上述例子中的meet(String Place)
函数成为了某个接口定义的方法.