1

この NotePadProvider サンプル コードでは、クラス内に名前も型もない静的ブロックがあることに気付きました。

static {
    sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
    sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
    sUriMatcher.addURI(NotePad.AUTHORITY, "live_folders/notes", LIVE_FOLDER_NOTES);

    sNotesProjectionMap = new HashMap<String, String>();
    sNotesProjectionMap.put(NoteColumns._ID, NoteColumns._ID);
    sNotesProjectionMap.put(NoteColumns.TITLE, NoteColumns.TITLE);
    sNotesProjectionMap.put(NoteColumns.NOTE, NoteColumns.NOTE);
    sNotesProjectionMap.put(NoteColumns.CREATED_DATE, NoteColumns.CREATED_DATE);
    sNotesProjectionMap.put(NoteColumns.MODIFIED_DATE, NoteColumns.MODIFIED_DATE);

    // Support for Live Folders.
    sLiveFolderProjectionMap = new HashMap<String, String>();
    sLiveFolderProjectionMap.put(LiveFolders._ID, NoteColumns._ID + " AS " +
            LiveFolders._ID);
    sLiveFolderProjectionMap.put(LiveFolders.NAME, NoteColumns.TITLE + " AS " +
            LiveFolders.NAME);
    // Add more columns here for more robust Live Folders.
}

これはstatic { }どういう意味ですか?

また、この簡潔な構文をより読みやすい構文よりも使用する利点は何ですか (そのような構文が存在すると仮定しているだけです。最初の質問に回答するまで、それはわかりません)。

4

2 に答える 2

2

それがクラスの静的初期化子です。一度だけ実行されます。いつ?アプリケーションでそのクラスを初めて使用するとき。

アイデアは、そのクラスのすべてのインスタンスで使用されるいくつかの変数、構造、データなど (好きなものは何でも) を構築することです。または、たとえば、サイン値のルックアップ テーブルを作成するだけです。

呼び出される方法はいくつかあります。これらすべての状況:

  • new MyClass();最初に静的初期化子を呼び出し、次にコンストラクターを呼び出します
  • Class.forName("my.package.MyClass");
  • MyClass.staticMethodCallHere();
  • MyClass.class.methodCallHere();
于 2012-08-05T21:59:13.400 に答える
1

この静的な {} ブロックは何に適していますか?

静的メンバーがある場合は、次のようにこのブロックなしで作成できます。

static List<Integer> list = new ArrayList<Integer>();

しかし、あなたはそれで他に何もできません。この初期化ブロックを使用すると、静的なものに対する操作をコミットできます。

static List<Integer> list; // = new ArrayList<Integer>();

static
{
    list = new ArrayList<Integer>();
    for(int i=0; i<10; i++)  // just an example
        list.add(i);
}
于 2012-08-05T22:03:51.763 に答える