我有一個關於風格一段代碼備註:是反覆實例化一個匿名類浪費?
Iterable<String> upperCaseNames = Iterables.transform(
lowerCaseNames, new Function<String, String>() {
public String apply(String input) {
return input.toUpperCase();
}
});
的人說,我每次去通過這個代碼的時候,我實例化這個匿名函數類,而我倒是應該有一個單一的例如,一個靜態變量:
static Function<String, String> toUpperCaseFn =
new Function<String, String>() {
public String apply(String input) {
return input.toUpperCase();
}
};
...
Iterable<String> upperCaseNames =
Iterables.transform(lowerCaseNames, toUpperCaseFn);
在一個非常膚淺的層面上,這有點合理;多次實例化一個類需要浪費內存或者其他東西,對吧?另一方面,人們在代碼的中間實例化匿名類,就像沒有明天一樣,編譯器將它優化掉是微不足道的。
這是一個有效的擔憂?
Java中的對象分配速度非常快。實例化一個匿名類與「常規」類沒有什麼不同。由於匿名類沒有任何實例變量,幾乎沒有使用任何內存(並且對象本身可能會被分配到堆棧上 - 但我不確定)。但是那個人基本上是正確的:在一個循環中實例化對象*會很貴。但是這與匿名類無關,對於實例化任何類都是如此。 –
由於「不必要地創建一次性類」,我「浪費」了很多CPU週期。然後,我再次爲桌面/服務器編寫代碼,*我不在乎是否可以節省一毫秒或兩個[總體] *。相反,編寫代碼,以便很容易推斷 - 哪些*可能*(或可能不)意味着「重複使用」實例和/或給它一個綽號 - 然後進行配置。沒有配置文件的問題?沒問題! – user2864740
浪費是浪費。它是一個匿名類與它無關。 – EJP