静的クラス、インターフェイス、またはXMLリソースのいずれかでAndroidの定数を定義する最良の方法はどれですか?


98

Webサービスを使用してサーバーからデータを取得するAndroidアプリケーションを開発しています。そのため、開発システム、テストサーバー、およびライブサーバーをポイントするための3つの異なる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>

Java静的定数

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
ここでパフォーマンスが問題になるかどうかは非常に疑わしい...
Alex Lockwood '22

Webサービスの呼び出しが単一クラスか複数クラスか?
Venky

データをダウンロードして..だからするために、異なる目的のために、各ユーザ認証のための相互つまり、複数のクラスであること@venky、
Jayabal

回答:


92

XMLレイアウトでプロジェクトリソースを参照できるという点で、2つの間に大きな違いがあります。これらはアプリケーションコンテキストで使用できるため、グローバルアプリケーション全体からアクセスできます。プロジェクトリソースを使用する最大の利点は、アクセスが簡単で、プロジェクトを大幅に整理できることです。

static final定数はJavaバイトコードにコンパイルされます。プロジェクトリソースは、apk内でバイナリ形式にコンパイルされます。どちらかへのアクセスは非常に効率的です... 2つの間に違いがある場合、それはせいぜい取るに足らないものです。

プロジェクトでリソース/定数をどのように使用するべきかについての明確な規則はありません。とは言っても、XML または Javaコードで使用する必要があるかもしれない値には、個人的にリソースを使用しています。一方、私は通常、Javaコードでのみ使用され、実装に固有のstatic final値に定数を使用します。

また、デバイスの現在の構成(画面サイズ、ロケールなど)に応じて、実行時にXMLリソースをロードできることにも注意してください。そのため、定数をXMLで宣言するか、.javaファイルで直接宣言するかを決定するときに、これを考慮する必要があります。


リソースは、異なるフレーバー/ビルドタイプで構成する方がはるかに簡単です
HopefullyHelpful 2016年

@Alex疑いは1つありますが、それをクリアしてください。静的変数を少なくすることをお勧めします。静的変数を含む定数ファイルを作成すると、アプリケーションのパフォーマンスに影響しませんか?
Pallavi 2016年

2
考慮すべき追加のポイントは、最終的な定数が複数のクラスで使用されている場合、定数が変更された場合、それらのすべてのオブジェクトを再コンパイルする必要があるということです。しかし、定数がリソースとして格納されている場合はそうではありません。これは、コンパイルに長い時間がかかる大規模なプロジェクトでは重要な考慮事項になる可能性があります。
orodbhen 2017年

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

@Umar私は別の異なるロールを使用したいと思います別の異なるURL、助けてください、その前に私はursのように同じものを使用していました
Kuldeep Singh

11

一般的な場合:

  • XML値には、Javaファイルの定数に比べて、レイアウトファイルとマニフェストファイルにアクセスできるという利点があります。
  • XML値には、Javaファイルの定数よりも多言語サポートの利点があります

1
Dheereshに感謝します。そうですね、レイアウト、マニフェスト、Javaの両方からアクセスできるxmlの構成を保持しておくと非常に便利です
Jayabal

2

アプリのコードからUI文字列を抽出して外部ファイルに保存することは、常に良い習慣です。Androidでは、各Androidプロジェクトのリソースディレクトリを使用してこれを簡単に行うことができます。

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


問題は、Javaコードによってのみ内部的に使用される定数についてです。それは別のシナリオです。ユーザーインターフェースに属しているテキストタグの特定のケースでは、あなたが言及したように、適切な場所がAndroidプロジェクトのXMLリソースであることは間違いありません。
cesargastonec

2

どちらも良いように思えますが、それはあなたの要求次第ということです。

XMLに値(Webサービスリンク)があり、値(Webサービスリンク)に変更がある場合、XMLファイルのみを簡単に変更できます。

ただし、内部クラスを静的変数として使用する場合は、すべてのクラスファイルを変更する必要があります。

したがって、私の提案は、定数をソースファイルから分離し、リソースに入れてアクセスすることです。


1
「XMLファイルでのみ簡単に変更できます」これは、Javaファイルで変更するのと同じくらい簡単で、どちらの場合もプロジェクトを再構築する必要があるので、違いはないと思いますが、利点は別として。
Fran Marzoa

0

私は誰かがこれを尋ねてうれしいです...プラス1!

プロジェクトリソースはContextにアクセスする必要があります。これは、静的メソッドでは使用できません(渡さない限り)が、アクティビティでは常に使用可能です。リソースとレイアウトの間には優先的な接続があるようです。静的メソッドで処理される可能性のあるアプリ変数と定数については、抽象クラスを作成し、他のすべてのプロジェクトクラスファイルで(この定数クラスの)静的インポートを実行します。

PVS

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.