[英]More Elegant Way of Coding a Setter
我想知道他們是不是一種更聰明,更優雅的方式來編寫設置器,或者就此而言,是否有任何代碼必須檢查用戶輸入是否正確
這似乎很奇怪。 我是新手,所以也許這只是解決此問題的標准方法,但如果不是,我將不勝感激。
public void setMonth(){
boolean run = true;
while(run){
int input = scan.nextInt();
if(input > 0 && input < 13){
this.month = input;
run = false;
}
}
}
首先,您可以像這樣簡化代碼:
public void setMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
this.month = input;
}
除此之外,我將其分為兩個功能。 設置員只能設置一個值。
public void setMonth(int month) {
if(month > 0 && month <= 12) {
this.month = month;
} else {
throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
}
}
public void readMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
setMonth(input);
}
根據ChiefTwoPencils的建議,您還可以將設置器提取到其他類中。 從而進一步分離用戶輸入和數據。
class MonthDataHolder {
private int month;
public MonthDataHolder(int month) {
setMonth(month);
}
public void setMonth(int month) {
if(isValidMonthValue(month)) {
this.month = month;
} else {
throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
}
}
private boolean isValidMonthValue(month) {
return month >= 1 || month <= 12;
}
}
class InputReader {
public MonthDataHolder readMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
return new MonthDataHolder(input);
}
}
setter和getter也稱為mutators和accessor。
我的理解是,這些方法僅用於檢索或修改對象的“狀態”。 它不應具有業務邏輯,或者應盡可能少地包含業務邏輯。
基本上有便宜的計算/業務邏輯。
讓您的設置員僅“設置”值。
public void setMonth(int month){
this.month = month
}
雖然基於輸入來檢索值的方法可以在其他任何地方重用,但我建議您可以創建一個實用工具類,並將其作為靜態方法使用。
class DateUtil {
public static int retrieveMonthBasedOnInput(){
}
}
此類應具有業務邏輯以從用戶輸入中檢索詳細信息,並因此應在嘗試設置該bean實例的值時使用它。
該功能應該很簡單,並且只能完成一項工作。 也許您可以像這樣編寫代碼:
public void setMonth(int month) throws IllegalArgumentException {
if(month<0 || month>11) throw new IllegalArgumentException("Month can only be set 0~11");
this.month = month;
}
如您所見,該功能僅執行設置月份的一項操作。 如果參數不正確,則引發異常。
編寫“好” stter的規則:
1)不要在設置器中進行任何輸入輸出操作,例如訪問數據庫,文件,網絡,電子郵件發送,從命令行讀取等。如果必須這樣做,請在調用setXXX之前或之后進行,最好編寫一些服務方法為了那個原因。
2)設置器中的邏輯應盡可能小。 可以進行參數驗證,例如范圍檢查等...
3)Setter只能做它設計的一件事情(設置一個值),它不應該有任何副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.