簡體   English   中英

構造函數與 getter 和 setter 的區別

[英]Difference between constructor and getter and setter

我一直在為大學項目做作業。 有一次,當您實際上可以使用構造函數方法來實現相同的結果時,我對 getter 和 setter 的實際用途感到困惑。 我已經搜索並找到了很多答案,但沒有令人滿意的解釋。 我有 notebook.java 如下

public class laptop {
    private String model;

    public laptop(String brand){
     model=brand;
        }

    public String toString(){
        return "Laptop Brand is: "+ model;
    }
}

和調用構造函數的 laoptopRecords.java

public class laptopRecords {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        laptop laptop1=new laptop("Dell");
        System.out.println(laptop1);
    }

}

在這里,我沒有使用 getter 和 setter 方法,而是為每個筆記本電腦對象獲得了所需的結果。

如果我以另一種方式在 notebookRecord.java 中使用 getter 和 setter 方法,如下所示,我得到相同的結果。 但是,如果實際上我們也可以使用構造函數獲得結果,那么我不知道 getter 和 setter 方法的用途是什么。

帶有 getter 和 setter 的 notebook.java

public class laptop {
    private String model;

    public laptop(String brand){
     model=brand;
        }
    public void setlaptop(String brand){
        model=brand;        
    }
    public String getlaptop(){
        return model;       
    }
    public String toString(){
        return "Laptop Brand is: "+ model;
    }
}

吸氣劑總是很好。 如果您忘記了您在創建時設置的品牌,那么有一種方法可以將其從該對象中提取出來。 如果你從其他地方得到那個對象怎么辦? 通過這種方式使用 getter 確定品牌很容易。 但是 getter 應該只對直接暴露的值可用。 如果不應該公開,則無需為internalVersionString創建 getter。 但是有一個colour的吸氣劑會很好......畢竟,你可以通過查看筆記本電腦來看到顏色(這對 OOP 來說是一個不好的類比,但恕我直言,它適合這里)。

關於二傳手......如果你只有一個屬性,那么確實沒有太大的(可見的)差異。 但除此之外,還有一個更深層次的主題……可變性。 當然,使用構造函數比簡單地設置屬性有更大的開銷(為一個全新的對象獲取內存 vs. 為字符串獲取內存)。

不使用 setter 的一個很好的例子是 Java 中的String類。 Java String是不可變的; 一旦創建,就無法進行任何更改。 如果要替換字符或刪除某些部分,您得到的不是更改后的字符串,而是進行了所需更改的全新字符串。 但是,如果您有一個名為TextDocument的類,它包含整個文件的數據,該怎么辦? 在不創建全新的TextDocument無法替換部分TextDocument可能會造成阻礙。

自動設置 setter 意味着您的對象是可變的; 這意味着,您的對象在創建時不是固定的,但可以在以后更改。 ArrayList將是一個很好的例子。 您肯定不想分配一個全新的列表只是為了更改單個值。

在使用像laptop這樣的簡單案例時,可變和不可變之間的區別並不那么明顯。 在進行並行工作時使用不可變類會派上用場,在處理需要分配大量內存的大對象時使用可變類會派上用場。

對於這個問題,沒有萬能的解決方案。 但是對於應該可以直接更改的公開屬性,setter 會很方便,而不必構造一個全新的對象。 想象一個具有多個屬性的類……以您的laptop為例,具有品牌、尺寸、顏色等等。 如果您只想更改顏色,那么必須構建一台新筆記本電腦並復制所有其他屬性會很乏味,不是嗎? 在這種情況下,二傳手會讓你的生活更輕松。 只需調用yourLaptop.setBrand("Dill"); 並繼續使用那台筆記本電腦。 沒有理由再花 500 美元(或者更確切地說……字節)。

我告訴你一個簡單的方法:

getters() 和 setters():

  • 實際上在 POJO/Bean 類中可用的 getter() 和 setter。
  • java類中使用getters() setters()的主要原因是為了獲取Java封裝機制。
  • 在 POJO/Bean 類中,我們將所有屬性聲明為私有屬性 這意味着這些類屬性不能在其他類和包中使用,所以在這里,我們可以實現封裝。

構造函數():

  • 我想你知道構造函數的定義,構造函數用於初始化給我們自己的值的屬性而不是存儲默認值
  • 我們可以說另一種方式,即構造函數用於創建對象,setter 用於更改對象內部的值,getters() 用戶用於獲取值,這只是主要區別。

當您擴展具有私有數據成員的類時,getter 和 setter 方法將幫助您訪問子類中的數據成員。而構造函數僅初始化數據成員。

  1. 構造函數用於初始化對象。
  2. 當我們使用參數化構造函數傳遞參數時,它只調用一次。
  3. 意味着您只能傳遞參數一次。
  4. 如果每次在內存中創建一個新對象時調用它超過 1 次。
  5. 而 getter 和 setter 可以根據您的使用多次調用來設置或獲取值

暫無
暫無

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

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