[英]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():
構造函數():
當您擴展具有私有數據成員的類時,getter 和 setter 方法將幫助您訪問子類中的數據成員。而構造函數僅初始化數據成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.