2013-04-23 36 views
6

Bạn có thắc mắc mà tôi đi quaphương pháp Setter trong constructor

public class Student{ 
    private String studentNumber; 
    private String studentName; 
    private double studentResult; 

    public Student (String aNumber, String aName){ 
     setStudentNumber(aNumber); 
     setStudentName(aName); 
     setStudentResult(0); 
    } 
    // The standard getter and setter method are define here. 
} 

mục đích của việc có phương pháp setter trong các nhà xây dựng là gì? và với setStudentResult (0), chúng ta cần có một biến cá thể khác không?

+1

Tại sao bạn cần một biến mẫu khác? Dường như bạn có ba bộ định cư và ba biến mẫu ... mặc dù thực tế là một số * được lưu trữ trong một chuỗi là một chút đáng lo ngại. –

+1

@Jon Skeet - Một số sinh viên có lẽ không thực sự là một con số. Giống như một số điện thoại không phải là. –

+0

@DonRoby: Số điện thoại không phải là ... nhưng số lượng sinh viên có lẽ nên theo kinh nghiệm của tôi. Hoặc nó phải được gọi là ID sinh viên. –

Trả lời

1

Bạn sẽ phải sử dụng thực hành mã ở trên khi bạn đang xử lý xác thực giá trị sent (mà bạn đang gửi).
Ví dụ, nếu bạn không muốn cho phép bất kỳ số âm nào được đặt làm studentNUmber từ hàm tạo thì bạn phải viết một logic để kiểm tra số bên trong hàm tạo hoặc phương thức bên trong tùy thuộc vào lớp đó là bất biến hay có thể thay đổi. Nếu class là mutable thì viết logic bên trong method và nếu class là bất biến thì viết logic bên trong constructor (trong phương thức setter viết không thay đổi được không được phép vì method setter có thể thay đổi trạng thái của đối tượng).
Nếu bạn không áp dụng logic như vậy thì bất kỳ giá trị âm nào cũng có thể được đặt thành studentNumber.

Ngoài ra, phương pháp setter là hữu ích khi bạn có một đối tượng được tạo ra trong một số lớp khác và sau đó bạn muốn thay đổi nó là nhà nước, chẳng hạn, bạn muốn cập nhật tên của sinh viên, như ví dụ đưa ra dưới đây,

public class Student { 
    private String studentNumber; 
    private String studentName; 
    private double studentResult; 
    // The standard getter and setter method are define here. 

    public Student(String aNumber, String aName) { 
     studentNumber = aNumber; 
     studentName =aName; 
    } 

    public String getStudentNumber() { 
     return studentNumber; 
    } 

    public void setStudentNumber(String studentNumber) { 
     this.studentNumber = studentNumber; 
    } 

    public String getStudentName() { 
     return studentName; 
    } 

    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 

    public double getStudentResult() { 
     return studentResult; 
    } 

    public void setStudentResult(double studentResult) { 
     this.studentResult = studentResult; 
    } 

    @Override 
    public String toString() { 
     return "studentNumber:"+studentNumber+", studentName"+studentName+", studentResult"+studentResult; 
    } 

} 

class Test { 
    public static void main(String[] args) { 
     Student s = new Student("1", "AAA"); 
     s.setStudentName("BBB"); //we should call this method because of "studentName" is private variable in Student class. 
     System.out.println(s); 
    } 
} 

về setStudentResult, bạn không cần phải có một biến mẫu khác vì nó đã được khai báo trong lớp Student. Thay vào đó, bạn cần thêm một tham số khác trong hàm tạo vào giá trị setStudentResult.

public Student(String aNumber, String aName, long result) { 
     studentNumber = aNumber; 
     studentName =aName; 
     studentResult =result; 
    } 
+0

Tôi nghĩ rằng nó sẽ gây ra vấn đề khi lớp 'Student' được phân lớp bởi một lớp khác, vì hàm tạo lớp con luôn gọi hàm tạo siêu lớp. – Sam

+0

Chỉ cần nói rằng một cái gì đó không phải là một thực hành tốt là không hữu ích cả. Tôi không đồng ý với kết luận của bạn, nhưng không có bất kỳ lời giải thích nào khó nói chính xác ở đâu. –

4

Gọi phương pháp có thể ghi đè là chống mẫu, có thể gây ra sự cố nếu Học sinh bị ghi đè. Một mô hình tốt sẽ làm cho Sinh viên bất biến

public class Student{ 
    private final String studentNumber; 
    ... 
    public Student (String studentNumber, ...) { 
     this.studentNumber = studentNumber; 
    ... 
1

Bạn đang làm bất kỳ logic nghiệp vụ nào trong phương thức setter của mình. Nếu có tôi đoán đó là lý do bạn gọi setter từ constructor. Nếu bạn chỉ đang seeting biến instance của bạn bên trong setter của bạn, sau đó thiết lập biến cá thể trực tiếp là điều bình thường để làm.

public class Student{ 
private String studentNumber; 
private String studentName; 
private double studentResult; 

public Student (String aNumber, String aName){ 
this.studentNumber = aNUmber; 
this.studentName=aName; 
this.studentResult=0; 
} 
0

Không nên gọi phương thức từ hàm tạo. Các nhà xây dựng được sử dụng để đặt giá trị ban đầu của các trường.

Nếu bạn muốn gọi phương thức từ nhà thầu và bạn không muốn một số người ghi đè lên phương thức đó. Việc khai báo lớp học là cuối cùng

+0

Nếu lớp này có thể thay đổi, tôi nghĩ việc gọi người định cư từ nhà xây dựng là hợp lý - theo cách đó, nếu có bất kỳ xác thực nào (ví dụ: số không thể là số âm), bạn chỉ có logic đó ở một nơi. Tôi đồng ý rằng đó là một ý tưởng tồi khi gọi các phương thức không phải cuối cùng từ các nhà xây dựng, nhưng những người định cư có thể dễ dàng được thực hiện cuối cùng. –

3

Lý do thông thường được định nghĩa cho các bộ định cư trong một hàm tạo là do đó bạn đang sử dụng cùng một xác nhận hợp lệ. Tuy nhiên, tự đóng gói là một mô hình chống.

Một cách tốt hơn để thực hiện chính xác những gì bạn đã viết là có phương pháp tĩnh xây dựng đối tượng và gọi các phương thức đã đặt. Tốt hơn nhiều so với điều đó sẽ làm cho toàn bộ điều bất biến.

0

Như đã đề cập bằng phương pháp setter trong một constructor không phải là một ý tưởng tốt vì hai lý do:

  1. lớp con có thể ghi đè lên chúng, mà có lẽ sẽ đưa các đối tượng trong một trạng thái đó đã không được đưa vào tài khoản .

  2. phương thức setter có thể có chức năng mà bạn thường không muốn trong hàm tạo.

Lý do tại sao điều này được thực hiện là twofolds:

  1. thường xuyên nhất, IDE (như nhật thực) thực hiện điều này tự động nếu bạn tạo setter/getter sau khi bạn viết các nhà xây dựng.

  2. Có những lúc phương thức setter thực hiện xác thực hoặc định dạng mà bạn muốn thực hiện khi khởi tạo với một hàm tạo. Trong trường hợp này, tôi sẽ đề nghị trích xuất xác nhận/định dạng thành một hàm khác, và gọi hàm đó từ cả hàm tạo và bộ chọn.

Các vấn đề liên quan