2017-04-20 71 views
0

我看過一個人的視頻,說我們應該儘可能地使用原語而不是對象。 原因是訪問一個對象意味着使用一個指針,所以有一個開銷。JAVA - 指針追逐 - 最佳實踐

因此:

  • 如果存在映射與(使用JPA)SQL表具有多個字段是在數據庫中,因爲潛在的空值的對象類(例如:0的整數不是int)
    • 我應該創建一個母類嗎?如果可能的話,將對象替換爲原語,在我的應用程序中使用等價於null的固定值?(例如:-1,而不是零)處理大量數據
    • 的並且被映射到數據庫中的子類中,只有在保存數據時使用的
    • 當在子
    • 母親類正在使用I類可以添加映射成列的一些方法,象下面這樣:
@Column("MY_COLUMN") 
public Integer getId() { 
    // super.getIdAsInt() returns a value of type int, the primitive. 
    // -1 means value not set in my app. 
    Integer result = (super.getIdAsInt() == -1) ? null : super.getIdAsInt(); 
    return result; 
} 

我覺得這種模式也可應用於任何情況下的子類是關於持久性數據(插入數據庫或一個XML文件,...)和空值的字段是有意義的。

  • 您認爲這些可能是最佳實踐,以提高應用程序的性能嗎?
  • 如果不是,你能給我舉一些潛在的缺點嗎?

感謝,

+4

也許你正在將這視爲一個問題。 – freedev

+4

我認爲你正在嘗試過早地優化你的解決方案。你使用的是OO語言,爲什麼你不應該使用對象?確實存在開銷,但除非您迫切需要儘可能快的結果,否則不要擔心,請專注於以可能的最佳方式解決關鍵問題,如果發現存在性能問題,那麼剖析代碼並查看可以改進的地方 – MadProgrammer

+2

如果您的意思是NULL,則返回NULL的虛擬值是代碼異味。你不應該暗示它是NULL,你應該說它是NULL。任何使用getID並假定非空值爲非空值的人都將在激動人心的時間內調試爲什麼該對象實際上不存在。 – Compass

回答

1

使用包裝類的好處遠遠大於任何開銷的影響。對象可以在集合中使用,並且它們可以爲null。 NullPointerException比由未初始化原語引起的錯誤更易於調試。

此外,您提出的解決方案會爲您的應用程序增加不必要的複雜性,因爲您和其他開發人員不想在此過程中處理這些複雜問題。

這個問題is also discussed here

+0

感謝您的回答。是的,使用虛擬值而不是null將不那麼直觀。所以我最好避免在API中使用它。 **然而,在設計你的模型類時,不能加入不必要的Object字段,而不是僅僅添加一些原始字段(即:少於三個)?**但是,在設計模型類時,它不是一個參數嗎?**特別是當你知道你將要處理huga數據量。 – Kris

0

您的數據從數據庫中獲取,並且這個數據量大於指針追蹤懲罰的數量級。無論你可能獲得的是微不足道的,並且使用條件和分配包裝來抵消你的getId的成本。你的不重要的getter可能會阻止內聯,然後你將失去更多。

在使用大量原語很多次的數字運算代碼中避免包裝可能是必不可少的。對於大多數程序來說,這是非常不相關的。