정적 클래스, 인터페이스 또는 xml 리소스 중 하나 인 Android에서 상수를 정의하는 가장 좋은 방법은 무엇입니까?


98

웹 서비스를 사용하여 서버에서 데이터를 가져 오는 Android 애플리케이션을 개발 중입니다. 그 이유는 개발 시스템, 테스트 서버 및 라이브 서버를 가리키는 세 가지 다른 URL 세트를 가지고 있기 때문입니다. 테스트 / 라이브 신청을 할 때마다 URL을 변경하기가 어렵습니다. 그래서 나는 그것을 구성 가능하게 만들 계획이었습니다. 그래서 응용 프로그램은 저를 기반으로 적절한 URL을 얻을 수 있습니다. 그래서,

  • 이 상수, Java 정적 클래스 또는 Java 공용 인터페이스 또는 xml 리소스 파일을 유지하는 가장 좋은 방법은 무엇입니까? 언제? 왜?
  • 어느 것이 더 나은 성능을 제공 합니까? , 언제? 왜?

예 : xml 리소스

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>

자바 정적 상수

public class Config {
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = {"http://development.com/", "http://test.com/", "http://example.com"};
}

1
여기에서 성능이 문제가 될 것
같지 않습니다

웹 서비스 호출이 단일 클래스에 있는지 아니면 다중 클래스에 있습니까?
Venky

@venky 것을 여러 클래스에서, 다른 목적으로 각 ... 다운로드 데이터에 사용자 인증 다른 하나를, 즉 등
Jayabal

답변:


92

XML 레이아웃에서 프로젝트 리소스를 참조 할 수 있다는 점에서 둘 사이에는 큰 차이가 있습니다. 응용 프로그램 컨텍스트에서 사용할 수 있으므로 전역 응용 프로그램에서 액세스 할 수 있습니다. 프로젝트 리소스 사용의 가장 큰 장점은 액세스 용이성과 프로젝트를 크게 구성 할 수 있다는 것입니다.

static final상수는 자바 바이트 코드로 컴파일됩니다. 프로젝트 리소스는 apk 내에서 바이너리 형식으로 컴파일됩니다. 둘 중 하나에 액세스하는 것은 매우 효율적입니다 ... 둘 사이에 차이가 있으면 기껏해야 사소합니다.

프로젝트에서 리소스 / 상수를 사용하는 방법에 대한 정해진 규칙이 없습니다. 즉, 저는 개인적으로 XML 또는 Java 코드 에서 사용해야하는 값에 리소스를 사용 합니다. 반면에 저는 일반적으로 Java 코드 에서만 사용하고 구현에 특정한 static final값에 상수를 사용합니다.

또한 장치의 현재 구성 (예 : 화면 크기, 로케일 등)에 따라 런타임에 XML 리소스를로드 할 수 있습니다. 따라서 상수를 XML로 선언해야하는지 아니면 .java파일 에서 직접 선언해야하는지 결정할 때이 점을 고려해야 합니다.


자원은 다른 맛 / 빌드 종류의 구성에 훨씬 쉽게
HopefullyHelpful

@Alex 한 가지 의심 할 여지가 있습니다. 정적 인 변수를 덜 사용하는 것이 좋습니다. 따라서 정적 변수로 상수 파일을 만들면 응용 프로그램의 성능에 영향을주지 않습니까?
Pallavi

2
고려해야 할 추가 사항은 최종 상수가 여러 클래스에서 사용되는 경우 상수가 변경되면 모든 객체를 다시 컴파일해야한다는 것입니다. 그러나 상수가 리소스로 저장되는 경우에는 그렇지 않습니다. 컴파일하는 데 오랜 시간이 걸리는 대규모 프로젝트의 경우 중요한 고려 사항이 될 수 있습니다.
orodbhen

23

클래스를 사용하여 상수를 정의하고 필요한 곳을 호출하는 방법을 알고 싶은 사람들을 위해.

Constant.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant {
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;
}

이제 위의 상수를 다음과 같이 사용할 수 있습니다.

Constant.NOTICE_BUTTON_BLINK_DURATION

1
가장 좋은 방법에 대한 질문이 요청되었습니다!
shadygoneinsane

내가 URS처럼 같은 사용했는데 그 전에 @Umar 나는 ,, 다른 다른 역할 다른 다른 URL, 제발 도움을 사용하려면
Kuldeep 싱

11

일반적인 경우 :

  • XML 값은 Java 파일의 상수보다 레이아웃 파일 및 매니페스트 파일의 접근성 이점이 있습니다.
  • XML 값은 Java 파일의 상수보다 다중 언어 지원에 대한 이점이 있습니다.

1
감사합니다 Dheeresh, 나중에 이해했습니다. 레이아웃, 매니페스트 및 자바 모두에 의해 액세스되는 xml에 구성을 유지하는 것이 매우 유용합니다
Jayabal

2

항상 앱 코드에서 UI 문자열을 추출하여 외부 파일에 보관하는 것이 좋습니다. Android는 각 Android 프로젝트의 리소스 디렉터리를 사용하여 쉽게 만들 수 있습니다.

http://developer.android.com/training/basics/supporting-devices/languages.html


문제는 Java 코드에 의해서만 내부적으로 사용되는 상수에 관한 것입니다. 다른 시나리오입니다. 언급했듯이 사용자 인터페이스에 속하는 특정 텍스트 태그의 경우 Android 프로젝트의 XML 리소스가 올바른 위치에 있다는 것은 의심의 여지가 없습니다.
cesargastonec

2

두 가지 모두 좋은 것 같지만 요구 사항에 따라 다릅니다.

XML에 값 (웹 서비스 링크)이 있고 값 (웹 서비스 링크)에 변경이 있다고 가정하면 XML 파일에서만 쉽게 변경할 수 있습니다.

그러나 내부 클래스를 정적 ​​변수로 사용하는 경우 모든 클래스 파일에서 변경해야합니다.

그래서 내 제안은 소스 파일에서 상수를 분리하고 리소스에 넣고 액세스하는 것입니다 ..


1
"XML 파일에서만 쉽게 변경할 수 있습니다."Java 파일에서 변경하는 것만 큼 쉽습니다. 두 경우 모두 프로젝트를 다시 빌드해야하므로 차이가 없다고 생각합니다. 이점은 제쳐두십시오.
프랜 Marzoa

0

누군가이 질문을하게되어 기쁩니다.

프로젝트 리소스는 Context에 액세스해야합니다. 이는 정적 메서드 (예 : 전달하지 않는 한)에서는 사용할 수 없지만 항상 활동에서 사용할 수 있습니다. 리소스와 레이아웃간에 우선 연결이있는 것 같습니다. 정적 메서드에서 처리 할 수있는 앱 변수 및 상수의 경우 추상 클래스를 만들고 다른 모든 프로젝트 클래스 파일에서이 상수 클래스의 정적 가져 오기를 수행합니다.

베트남 후 증후군

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.