二級(jí)考試JAVA基礎(chǔ):使用Enum替換int常量

字號(hào):

這一步比較簡(jiǎn)單,先創(chuàng)建一個(gè)enum類:
    package de.jingge.refactoring;
    public enum SystemState {
    LOGGEDIN,
    LOGGEDOUT,
    IDLE;
    }
    然后開始重構(gòu)SystemManager, 使用SystemState代替SystemManager里的int狀態(tài):
    1. 添加 import static de.jingge.refactoring.SystemState.*;
    2. 刪除所有的integer常量
    3. 將變量state的類型改為SystemState.
    代碼如下:
    package de.jingge.refactoring;
    import static de.jingge.refactoring.SystemState.*;
    public class SystemManager {
    SystemState state;
    public void login() {
    // call service#login()
    updateState(LOGGEDIN);
    }
    public void logout() {
    // call service#logout()
    updateState(LOGGEDOUT);
    }
    public void idle() {
    // call some other services
    updateState(IDLE);
    }
    public void updateState(SystemState state) {
    if (state == LOGGEDIN) {
    // do something after logging in is successful,
    // for example: show welcome dialog, open the last edit document, etc.
    } else if (state == LOGGEDOUT) {
    // do something after logging out is successful,
    // for example: free used resource, dispose GUI components, etc.
    } else if (state == IDLE) {
    // do something after the user is idle,
    // for example: save the application state temporarily, lock the application, etc.
    } else {
    throw new IllegalArgumentException("unknown state");
    }
    this.state = state;
    }
    }
    然后重構(gòu)測(cè)試類:
    1. 添加import static de.jingge.refactoring.SystemState.*;
    2. 刪除所有常量前引用的SystemManager.
    package de.jingge.refactoring;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import static org.junit.Assert.*;
    import static de.jingge.refactoring.SystemState.*;
    public class SystemManagerTest {
    private static SystemManager manager;
    @BeforeClass
    public static void setUpClass() throws Exception {
    manager = new SystemManager();
    // add some service mock objects
    }
    @AfterClass
    public static void tearDownClass() throws Exception {
    }
    @Test
    public void login() {
    manager.login();
    assertEquals(manager.state, LOGGEDIN);
    }
    @Test
    public void logout() {
    manager.logout();
    assertEquals(manager.state, LOGGEDOUT);
    }
    @Test
    public void idle() {
    manager.idle();
    assertEquals(manager.state, IDLE);
    }
    }