3

簡単な質問です。コードを確認すると、多くの変数がクラスまたはメソッドで複数回宣言されていることに気付きました...例:

public Long dbInsertCheckin(final String Class) {
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
...
}

public class SmashDataSource {
    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    final SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
    final SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
...
}

これにより、複数の場所で使用する「dateformat」、「sdf」、または「timeformat」などを宣言する代わりに、アプリケーションクラスでこれらをグローバルに宣言し、どこでも参照する方が理にかなっていないのではないかと考えました。のようにしたかった

public class MyApp extends Application {
public final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public final SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
    public final SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");

後で他のクラスでそれらを参照します。

MyApp.dateformat
Myapp.sdf

これは、パフォーマンス/メモリ使用量の観点から優れていますか? これをしない理由はありますか?私には、それらを複数回宣言すると、1回の最終宣言と比較して、より多くのメモリを消費するように思えます....しかし、コンパイラが最適化をどのように行うかはわかりません。

4

5 に答える 5

3

グローバル変数を使用することに問題はありません。通常、それらは物事を柔軟にカプセル化するために避けられます。ただし、ファクトリ パターンのような一部の設計パターンは、静的/グローバル クラスに適しています。また、コードの重複も回避されます。

Application(ただし、グローバル フィールドが必要な場合にのみ使用されるように、クラスの使用を避ける場合がありますが、それは実装の詳細です。)

私はおそらくこのようなことをするでしょう。物事を柔軟に保ちながら、物事を 1 か所にまとめて、アプリ全体で一貫性を保つことができます。

public class MyGlobals
{
    private static SimpleDateFormat dateFormat;


    public static SimpleDateFormat getDateFormat()
    {
        if(dateFormat== null)
        {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
        return dateFormat;

    }
}

次に、これを他のクラスで使用できます。

MyGlobals.getDateFormat();

====


これに関する開発ドキュメントからの情報は次のとおりです。

http://developer.android.com/guide/faq/framework.html#3

複雑で非永続的なユーザー定義オブジェクトを短期間共有するには、次のアプローチが推奨されます。

シングルトンクラス

シングルトンを使用すると、アプリケーション コンポーネントが同じプロセスで実行されるという事実を利用できます。これは、インスタンスを 1 つだけ持つように設計されたクラスです。インスタンスを返す getInstance() などの名前の静的メソッドがあります。このメソッドが初めて呼び出されたときに、グローバル インスタンスが作成されます。すべての呼び出し元が同じインスタンスを取得するため、これを対話のポイントとして使用できます。たとえば、アクティビティ A はインスタンスを取得して setValue(3) を呼び出します。後でアクティビティ B がインスタンスを取得し、getValue() を呼び出して、最後に設定された値を取得する場合があります。

public static フィールド/メソッド

アクティビティ/サービス間でデータにアクセスできるようにする別の方法は、パブリックな静的フィールドやメソッドを使用することです。これらの静的フィールドには、アプリケーション内の他のクラスからアクセスできます。オブジェクトを共有するには、オブジェクトを作成するアクティビティがこのオブジェクトを指すように静的フィールドを設定し、このオブジェクトを使用する他のアクティビティはこの静的フィールドにアクセスするだけです。

オブジェクトへの WeakReferences の HashMap

長いキーを持つオブジェクトへの WeakReferences の HashMap を使用することもできます。アクティビティがオブジェクトを別のアクティビティに渡したい場合、オブジェクトをマップに配置し、インテント エクストラを介して受信者アクティビティにキー (カウンターまたはタイム スタンプに基づく一意の Long) を送信するだけです。受信者アクティビティは、このキーを使用してオブジェクトを取得します。

永続オブジェクト

アプリケーションが実行を続けているように見えても、システムはそのプロセスを強制終了し、後で再起動することを選択する場合があります。あるアクティビティの呼び出しから次の呼び出しまで保持する必要があるデータがある場合、そのデータは、アクティビティがなくなる可能性があると通知されたときにアクティビティによって保存される状態として表す必要があります。

複雑で永続的なユーザー定義オブジェクトを共有するには、次のアプローチが推奨されます。

Application Preferences
Files
contentProviders
SQLite DB

アプリケーション プロセスを強制終了できるポイント間で共有データを保持する必要がある場合は、そのデータをアプリケーション設定、SQLite DB、ファイル、または ContentProvider などの永続ストレージに配置します。これらのコンポーネントの使用方法の詳細については、データ ストレージを参照してください。

于 2012-09-26T17:13:25.857 に答える
1

それはすべて、必要なものと現在のコンテキストに要約されます。

少しリファクタリングする余裕がある場合、私見の最善のアプローチは、この種の変数をすべて含むコンテキスト クラスを作成することです。リファクタリング セッションを利用して、他の構成パラメーターをそのクラスに移動し、シングルトンとして使用することもできます。

public class MyApplicationContext {
    //Constants and other global variables (I'd make the strings global, rather than
    //The time formats in this case.
    public final String TIME_FORMAT = "HHmm";

    //Context variables (taken from your source of choice)
    private String someConfigurationPath = "...";

    //Getters & Setters
}
于 2012-09-26T17:07:58.450 に答える
1

はい、これらを 1 か所で定義することをお勧めします。これは、単純であるだけでなく、コード ベース全体を調べなくてもグローバル スケールで変更する方がはるかに簡単だからです。個人的には、次のようなものを使用します。

public static final LONG_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

SimpleDateFormatただし、この特定のケースでは、オブジェクトがスレッドセーフではないため、注意が必要です。これは、アプリケーション全体で 1 つのインスタンスを共有する場合、同時実行の問題を回避するためにいくつかの追加の手順を実行する必要があることを意味します。詳細については、次のいずれかを参照してください。

SimpleDateFormat スレッド セーフ

SimpleDateFormat がスレッドセーフでないことの証明

「Java DateFormat はスレッドセーフではありません」これは何につながりますか?

于 2012-09-26T17:07:34.223 に答える
1

グローバル変数は、コードの匂いの指標になる可能性があります。

おそらく、同じ単純な日付形式が使用されているさまざまな場所でパターンを見つけることができます。これは、コードをリファクタリングし、すべての共通部分を 1 つの場所に移動する機会になる可能性があります。たとえば、SimpleDateFormat を複数インスタンス化し、さらに重複コードを囲む代わりに、新しいメソッド (printDate(aDate) など) に結合します。

于 2012-09-28T20:32:32.243 に答える
0

変更内容によって異なりますが、すべての構成変数を静的として持っている場合は、1 つの場所で日付形式を変更するだけで、他のすべてを変更する必要はありません。

日付形式などについては、国/言語ごとに日付形式を変更できるように、日付文字列を stings.xml ファイルに入れることが望ましい場合があります。

于 2012-09-26T17:00:30.203 に答える