这个未命名的静态神秘语法是什么意思?

时间:2012-08-05 21:57:52

标签: java

在这个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 { }是什么意思?

此外,使用这种简洁的语法而不是更易读的语法有什么好处(我只假设存在这样的语法,在第一个问题得到解答之前我肯定不知道。)

2 个答案:

答案 0 :(得分:2)

这是该类的静态初始值设定项。它只执行一次。什么时候?您第一次在应用程序中使用该类。

这个想法是构建一些变量,结构,数据等...(无论你喜欢什么),将在该类的所有实例中使用。或者,例如,只需构造一个正弦值的查找表。

有几种方法可以调用它。所有这些情况:

  • new MyClass();首先调用静态初始值设定项,然后调用构造函数
  • Class.forName("my.package.MyClass");
  • MyClass.staticMethodCallHere();
  • MyClass.class.methodCallHere();

答案 1 :(得分: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);
}