簡體   English   中英

Java:getter方法與公共實例變量:性能和內存

[英]Java: getter method vs. public instance variable: performance and memory

抱歉沒有問題。 通過引用與價值相結合很難!

所以我有一個具有相當大的數據結構的類 - 多維數組。 我需要從另一個類訪問這些數組。 我可以將數組公開並執行經典的objectWithStructures.structureOne。 或者,我可以做getters:添加像public int [] [] [] getStructureOne()這樣的方法。

有一個getter是否復制了多維數組? 或者它通過引用傳遞它,你只是不能改變引用的對象?

我擔心記憶和表現。 但是,如果不使數據結構公開,那么將數據結構公之於眾,看起來就像編寫糟糕的編碼實踐一樣。

ADDENDUM:所以當我使用getter方法返回對象(例如數組)的引用時,是否可以使用getter方法編輯該對象? 或者它是否以某種方式“鎖定”進行編輯,以便只有它所在的類可以改變該對象?

實際上在java中,從技術上講,一切都是按值傳遞的,因為引用是內存地址的 ,但是您可以將其視為通過引用傳遞。

至於性能,我懷疑是否存在可衡量的差異,因為JVM JIT編譯器可能會在訪問器方法(“getter”)內嵌。 作為一種風格問題,最好使用吸氣劑而不是將你的田地公之於眾。

至於安全發布(允許安全訪問私人數據) - 不,該對象不是“鎖定在只讀模式”; 它是完全可編輯的,因為數組是可變的。

要安全地允許訪問您的數據陣列,您基本上有兩個選擇:

  1. 從你的getter返回一個數組的副本 - 昂貴
  2. 提供一個返回給定位置元素的API - 代碼簡單,但稍后可能更難更改數組維度,因為已經為您的類定義了API

提供API的示例可能是:

public int getStructureOne(int x, int y, int z) {
    return structureOne[x][y][z];
}

這個方法是完全安全的,因為原語(比如int )是按值傳遞的 - 調用者改變了賦值方法的變量值,數組沒有任何反應。

通過引用與價值相比很難

在Java中,一切都按值傳遞。 原始類型通過其值傳遞,復雜類型通過其引用的值傳遞。 數組不是原始的,因此它們的引用被傳遞。

我可以把數組公開......或者,我可以做吸氣劑

如果它們是public則其他類可以更改對象包含的數組引用。 如果有getter返回對數組的引用,則調用者可以更改數組的內容。 兩者都很糟糕。 這也回答了你的補遺問題。

我認為選項如下:

  • @Bohemian建議,對單個細胞使用吸氣劑。 如果需要對陣列對象進行任何鎖定,則此處可能存在額外的panalties

  • 返回對數組的引用,並相信您的調用者不要搞砸它。 可以通過在編譯時檢查訪問來實現額外的chekcs

  • 在對象內維護兩個數組副本。 一個是在吸氣劑中返回,另一個是為了真正的工作。 您可以記錄更改數組無效並斷言從getter返回時其內容相同。

一切都是通過傳遞,但getter將返回對數組的引用 ,不涉及任何副本。

任何修改過的人都會被所有人看到並引用該數組。

至於1)表現,唯一知道的方法就是基准。 get方法會增加開銷,但如果你的結構很大,那么對結構中元素的任何訪問都會使添加的方法調用的任何開銷相形見絀。

至於2)糟糕的編碼實踐,它實際上取決於你在做什么。 您的代碼是否需要確保其他人無法修改? 然后返回一份副本。 或者更好的是,強制呼叫者詢問一系列數據,並僅返回他們所需范圍的副本。

Java按值傳遞所有內容。 Java引用是按值傳遞的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM