亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為類中的私有變量定義“好的”get() 方法?

如何為類中的私有變量定義“好的”get() 方法?

偶然的你 2023-03-17 14:16:38
我正在學習Java,我有一些疑問。如果定義了一個帶有私有變量的類class test<A>{private A var;...public A get(){    return var;}}是get方法錯了嗎?我認為是這樣,因為有了這個定義,我可以像這樣修改變量“var”test<A> x = new test<A>();A temp = x.get();temp.set(*something*);最后 x 被更改(我使用 Vector 作為 A 對其進行了測試)。如果我理解正確的話,這是有效的,因為對象引用(我想念 C 指針,sob)。我錯了嗎?可能我不明白關鍵字“private”的用途!提前致謝!編輯:我對“按引用傳遞”和“按值傳遞”沒有問題。我懷疑在類中為私有變量定義 get() 方法(你不說?)。請停止鏈接Java 是“按引用傳遞”還是“按值傳遞”?
查看完整描述

4 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

如果您的 getter 方法返回對可變對象的引用,那么這會大大削弱您的類提供的封裝質量,因為可以在不調用類的方法的情況下修改類實例的狀態。

防止此問題的一種標準策略是 J. Bloch 所說的防御性副本(Effective Java,第 3 版,第 50 項:“在需要時制作防御性副本”)。

var這意味著在 getter 方法中創建一個副本,然后返回該副本。如何做到這一點取決于A.

因為A是類型參數,制作實例的副本需要設計上的額外支持。要了解如何使用 Java 的克隆機制實現此目的,請參閱我對帖子“創建類型接口而不是使用有意義嗎?”的回答。CopyableCloneable


查看完整回答
反對 回復 2023-03-17
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

我要在這里補充一點:正如其他人所說,您分發對象引用并且可以對其進行修改,這可能很糟糕。

面向對象是關于將數據和處理數據的代碼保存在一個地方。如果您需要 getter,請考慮 getter 的調用者需要做什么,以及該操作是否應該是具有數據的類上的方法。您的代碼可能會遇到Feature Envy代碼異味,因為它違反了告訴,不要詢問原則。

要解決此問題,請移除 getter,并根據需要引入新方法。例如,如果您有一些需要打印的數據對象,您可以將 Printer 傳遞給對象并讓它自己打印到給定的 Printer。

如果你正在處理一個集合類(只是從你的模板參數中猜測),你可能需要保留 getter,但是你可能并不關心調用者無論如何都會改變值。


查看完整回答
反對 回復 2023-03-17
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

對于剛開始的人來說,這可能有點過于詳細,但您可能會回顧 class java.util.concurrent.atomic.AtomicReference<V>,這與您的示例非常相似。


一般來說,將實例變量放在私有變量中,同時使用 getter 和 setter 提供對變量的訪問是標準做法。


請注意,您的類名應該大寫,類型參數“V”更標準,變量名通常是“值”。此外,嘗試為班級選擇一個更具交際性的名稱。(類型參數類型變量可以是“ValueType”,這符合某些偏好。但是,單個字符類型變量名稱更常見。)


public class Wrapper<V> {

    private V value;

    public V get() {

        return value;

    }

    public void set(V value) {

        this.value = value;

    }

}


查看完整回答
反對 回復 2023-03-17
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

如果這是一個問題,您可以創建一個外觀來保護您的變量


public class Facade extends A {

  A myObj;


  public Facade (A obj) {

    myObj = 

  }


  public A get(){

    return myObj.get();

  }


  public B set(Object val) {

    throw new RuntimeException("Setting is not allowed");

  }

}


查看完整回答
反對 回復 2023-03-17
  • 4 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號