Android 개발 노트:정수 집합 대신 Enum(매 거 진 형식)을 사용 합 니 다.

안 드 로 이 드 의 API 에 서 는 정수 집합 을 매개 변수 로 사용 하 는 곳 이 많은 것 을 발견 할 수 있 으 니 먼저 실례 를 살 펴 보 자.LinearLayout 는 여러분 이 잘 알 고 있 는 UI 기본 요소 입 니 다.그 안에 한 방향의 속성 이 있 습 니 다.다음 과 같은 방법 으로 설정 할 수 있 습 니 다

LinearLayout.setOrientation(int);
사용 할 때 보통 이 렇 습 니 다

LinearLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.setOrientation(LinearLayout.VERTICAL);
그러나 이렇게 사용 할 수 있 습 니 다

LinearLayout.setOrientation(0); // LinearLayout.HORIZONTAL = 0
LinearLayout.setOrientation(1); // LinearLayout.VERTICAL = 0x01
심지어 이렇게 할 수 있 습 니 다

LinearLayout.setOrientation(Integer.MAX_VALUE);
LinearLayout.setOrientation(Integer.MIN_VALUE);
LinearLayout.setOrientation(2012);
방법 으로 setOrientation 이 받 은 매개 변 수 는 정수 입 니 다.그래서 너 는 임의의 합 법 적 인 정 수 를 전달 할 수 있다.적어도 이것 은 컴 파일 할 때 아무런 문제 가 없 을 것 이다.이것 은 실행 할 때 만 문 제 를 일 으 킬 수 있 습 니 다.그러나 알 고 있 는 바 와 같이 개발 자 는 프로그램 이 컴 파일 에 성공 할 수 있 는 지 에 만 관심 을 가지 고 있 습 니 다.실행 할 때 그것 은 사용자 가 관심 을 가 지 는 일 입 니 다.개발 자가 반드시 그들 이 개발 한 프로그램 을 사용 하 는 것 은 아니 기 때 문 입 니 다.이 예 를 제외 하고 Android 의 API 에서 이러한 API 를 곳곳에서 볼 수 있 습 니 다.예 를 들 어 View 의 가시 성 설정,Wifi 상태 설정 등 입 니 다.모두 정수 집합 을 정의 한 다음 에 정수 로 매개 변 수 를 만 들 고 개발 자가 정수 집중 정의 상수 로 매개 변 수 를 전달 할 수 있 기 를 바 랍 니 다.그러나 당신 이 알 고 있 는 바 와 같이 모든 사람 이 그렇게 규칙 을 지 키 는 것 은 아 닙 니 다.만약 모든 사람 이 규칙 을 지 킬 수 있다 면 이 세상 은 정말 조 화 롭 고 알 이 멀 어 질 것 입 니 다.개발 자 들 은 컴 파일 에 만 관심 을 가지 기 때문에 이 규칙 을 컴 파일 에 적용 할 수 있다 면 오류 가능성 을 크게 줄 일 수 있 습 니 다.관심 이 있 는 분 들 은 정수 인 자 를 받 는 방법 에'보통'수 치 를 전달 해 보 세 요.예 를 들 어 2012,Integer.MAXVALUE,Integer.MIN_VALUE 등등,어떤 상황 이 발생 할 지 봅 시다.또한 개발 자가 상수 정의 와 일치 하 는 정수 치 를 전달 하면 컴 파일 실행 이 틀 리 지 않 지만 코드 의 가 독성 이 크게 떨어진다.예 를 들 어

LinearLayout.setOrientation(0);
LinearLayout.setOrientation(1);
이것 은 전혀 틀 리 지 않 지만 코드 를 읽 는 사람과 유지 하 는 사람 은 보통 아프다.물론 Android 자체 에 보호 조치 가 있 습 니 다.API 에 불법 매개 변 수 를 전달 하면 다른 영향 을 주지 않 습 니 다.설정 만 유효 하지 않 지만 API 는 기본 값 을 사용 합 니 다.모든 내 장 된 매개 변수 에 해당 하 는 기본 값 이 있 기 때 문 입 니 다.LinearLayout 의 orientation 과 같이 기본 값 은 LinearLayout.HORIZONTAL 입 니 다.따라서 setOrientation()에 불법 값 이 들 어 오 면 LinearLayout 는 수평 배열 을 유지 하고 다른 영향 을 주지 않 습 니 다.뒤에 Linearlayout 의 orientation 에 대한 실험 이 있 습 니 다.또한,Layout XML 파일 에 이러한 속성 을 설정 하면 문제 가 되 지 않 습 니 다.예 를 들 어

<LinearLayout
android:orientation="vertical"
android:gravity="center">
XML 레이아웃 이 컴 파일 할 때 처리 되 기 때문에 불법 값 이 있 으 면 컴 파일 오류 가 발생 할 수 있 습 니 다.이것 이 바로 안 드 로 이 드 가 개발 자 들 에 게 XML 로 모든 레이아웃 을 만 들 도록 특별히 격려 하 는 이유 라 고 생각 합 니 다.예 를 들 어 세 개의 가리 키 는 선형 구 조 를 설정 하지 않 았 습 니 다.기본 값 은 수평 으로 배치 되 었 습 니 다.코드 에 몇 개의 터 무 니 없 는 값 을 설정 한 결과 수평 인 것 을 발 견 했 습 니 다.즉,터 무 니 없 는 값 을 설정 하 는 것 은 틀 리 지 않 지만 효과 가 없습니다.운행 결 과 는 다음 과 같 습 니 다.
코드 는 다음 과 같다.또 다른 장점 은 포장 이 더 좋 고 가장 중요 한 것 은 컴 파일 할 때 검 사 를 받 는 것 이다.자바 는 일종 의 Strong Type 이기 때문에 컴 파일 할 때 컴 파일 러 는 모든 원형 유형 과 매개 변수 유형 을 검사 합 니 다.형식 이 틀 리 고 강제 전환 이 없 으 면 컴 파일 오 류 를 보고 합 니 다.물론 컴 파일 러 가 지원 하 는 자동 전환 은 제외 합 니 다.예 를 들 어 int 가 필요 한데 전 달 된 매개 변 수 는 long 입 니 다.차이 가 많 지 않 고 넘 치지 않 지만 컴 파일 오류 가 발생 할 수 있 습 니 다.따라서 LinearLayout 가 Enum 을 사용 하면 이렇게 정의 합 니 다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    >
    <LinearLayout
        android:id="@+id/linearlayout_test_1"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content">

   <TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textColor="#ff00ff00"
     android:background="#aa331155"
     android:layout_weight="1"
     android:textSize="18sp"
     android:text="Microsoft"
        />
   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffff0000"
        android:background="#aa117711"
        android:layout_weight="1"
        android:textSize="18sp"
        android:text="Apple"
        />
   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff0000ff"
        android:background="#aa774411"
        android:layout_weight="1"
        android:textSize="18sp"
        android:text="Google"
        />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/linearlayout_test_2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ff00ff00"
           android:background="#aa331155"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Microsoft"
           />
      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ffff0000"
           android:background="#aa117711"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Apple"
           />
      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ff0000ff"
           android:background="#aa774411"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Google"
           />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/linearlayout_test_3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ff00ff00"
           android:background="#aa331155"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Microsoft"
           />
      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ffff0000"
           android:background="#aa117711"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Apple"
           />
      <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="#ff0000ff"
           android:background="#aa774411"
           android:layout_weight="1"
           android:textSize="18sp"
           android:text="Google"
           />
    </LinearLayout>
</LinearLayout>
그 다음 에 이렇게 사용 합 니 다

package com.android.explorer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
public class LinearLayoutTest extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.linearlayout_test);
        LinearLayout one = (LinearLayout) findViewById(R.id.linearlayout_test_1);
        one.setOrientation(2012);
        LinearLayout two = (LinearLayout) findViewById(R.id.linearlayout_test_2);
        two.setOrientation(Integer.MAX_VALUE);
        LinearLayout three = (LinearLayout) findViewById(R.id.linearlayout_test_3);
        three.setOrientation(Integer.MIN_VALUE);
    }
}
그러면 개발 자 는 잘못 사용 하지 않 습 니 다.먼저 setOrientation 에 필요 한 매개 변 수 는 Orientation 의 매 거 진 유형 이 고 Orientation 에서 정 의 된 유형 을 자 연 스 럽 게 전송 할 수 있 기 때 문 입 니 다.또한 0 이나 1 같은 다른 값 을 전달 하면 컴 파일 러 도 승낙 하지 않 을 것 이다.안 타 깝 게 도 안 드 로 이 드 의 거의 모든 API 는 정수 집합 으로 정의 되 기 때문에 항상 자신 과 그룹 에 있 는 사람들 에 게 정 의 된 정수 집중 의 상수 를 전달 해 야 한다 고 일 깨 워 야 한다.그러면 우리 가 할 수 있 는 일 은 정수 가 집중 적 으로 정 의 된 상수,정수 집합 방식 으로 정 의 된 API 를 제외 하고.더 중요 한 것 은 인 터 페 이 스 를 정의 할 때 정수 집합 대신 Enum 을 사용 하 는 것 이다.또 주의해 야 할 것 은 일부 약 한 유형의 언어,즉 컴 파일 할 때 유형 에 대해 특별히 세밀 한 검 사 를 하지 않 는 다 는 것 이다.예 를 들 어 C+,C 등 은 Enum 을 사용 하 더 라 도 안전 하지 않다.왜냐하면 C+와 C 에 있어 Enum 의 상수 가 정수 상수 와 똑 같 고 컴 파일 러 도 구분 하지 못 하기 때문이다.그래서 이런 언어 에 대해 서 는 개발 자 에 게 희망 을 걸 수 밖 에 없습니다.후기:이 글 을 쓰 고 나 서 저 는 매개 변수 정의 와 관련 된 또 다른 문 제 를 생각 했 습 니 다.예 를 들 어 불 형 매개 변수 도 좋 은 디자인 이 아 닙 니 다.사용자 가 True 를 전달 해 야 하 는 지,False 를 전달 해 야 하 는 지,특히 방법 이름 이 Boolean 매개 변수 역할 을 나타 내지 못 할 때 와 문서 가 명확 하지 않 을 때 입 니 다.만약 에 하나의 매개 변수 만 괜 찮 으 면 방법 이름과 상식 에 따라 알 수 있다.예 를 들 어

public class LinearLayout extends ViewGroup {
    private Orientation mOrientation;

    public enum Orientation {
        HORIZONTAL, VERTICAL
    };

    public void setOrientation(Orientation dir) {
        mOrientation = dir;
    }
}
그러나 특정한 상황 에서 방법의 이름 이 Boolean 매개 변수 의 역할 을 나타 내지 못 하거나 하나의 매개 변수 보다 많 을 때 방법의 주요 목적 은 Boolean 매개 변수의 역할 을 나타 내지 못 할 때 잘 모른다.예 를 들 어

import android.widget.LinearLayout;
LinearLayout.setOrientation(Orientation.HORIZONTAL);
LinearLayout.setOrientation(Orientation.VERTICAL);
이 boolean 변 수 는 채 신 을 위해 연락 처 를 특별 하 게 처리 할 지 여 부 를 결정 하 는 것 인지 알 수 있 습 니까?이 API 를 사용 할 때 True 를 전달 해 야 하 는 지 false 를 전달 해 야 하 는 지 빨리 알 수 있 습 니까?이 문 구 를 읽 었 을 때:

Button.setEnabled(true); // enable the button
Button.setEnabled(false); // disable the button
True 와 False 의 의미 와 역할 을 알 수 있 습 니까?적어도 나 는 이런 코드 를 보 았 을 때,그것 의 실현 을 추적 하지 않 으 면 알 아 맞 힐 수 없 었 다.그러나 현실 적 인 문 제 는 API 가 호출 자로 부터 해 야 하 는 지 안 해 야 하 는 지 에 대한 결정 이다.하나의 실행 가능 한 경 로 는 방법 으로 포장 하고 숨 기 는 것 이다.예 를 들 어

// com/android/mms/data/ContactList.java
public String[] getNumbers(boolean);
4.567913.이것 은 간단 한 상황 이다.약간 복잡 한 상황,예 를 들 어 다음 예 는 다른 인 터 페 이 스 를 추가 할 수 있다.다시 로드 하 는 방법 이 아니 라 내부 의 실현 은 다시 로드 해 야 할 수도 있 지만 이것 은 문 제 를 축소 시 켰 다.적어도 사용자 에 게 는 숨겨 진 것 이다

String[] mms = getNumbers(true);
String[] sms = getNumbers(false);
이렇게 되면 외국 에서 볼 때 좋 은 포장 이다.내부 실현 은 이런 사유 적 인 방법 이 필요 할 수도 있다

Button.setEnabled(true); // enable the button
Button.setEnabled(false); // disable the button
그러나 적어도 문 제 를 축소 시 켰 고 주석 을 붙 여 설명 할 수도 있다.사용자 로 하여 금 방법의 용법 과 의 미 를 추측 하 게 할 필요 가 없다.

좋은 웹페이지 즐겨찾기