在这个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 { }
是什么意思?
此外,使用这种简洁的语法而不是更易读的语法有什么好处(我只假设存在这样的语法,在第一个问题得到解答之前我肯定不知道。)
答案 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);
}