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 回答