2011-08-30 40 views
5

Tôi đang nghi ngờ với các sáng tạo phương pháp trong một lớp để thiết lập thông tin.Phương thức khai báo ưu tiên trong một lớp

  1. tạo phương pháp riêng biệt để thiết lập từng thuộc tính

    class Address{ 
        private String name; 
        private String city; 
    
        public setName(String name) { ... } 
        public setCity(String name) { ... } 
    } 
    
  2. tạo phương pháp duy nhất để thiết lập tất cả các thuộc tính

    class Address{ 
        private String name; 
        private String city; 
    
        public setAddress(String name,String city) { ... } 
    } 
    

từ trên hai cách đó là một lợi thế trong điểm ký ức về lượt xem?

+2

Hiển thị cho chúng tôi ý nghĩa của bạn với các mẫu mã cho cả hai cách tiếp cận. –

+0

mục đích của lớp học này là gì? nó là một đối tượng giá trị? bạn sẽ yêu cầu đặt từng giá trị một cách độc lập? Những giá trị này có thay đổi sau khi tạo đối tượng không? Bạn có ý nghĩa gì bởi "điểm nhìn của bộ nhớ"? Bộ nhớ của con người hoặc bộ nhớ máy tính? – buritos

+0

Ví dụ thứ nhất là tốt, ví dụ thứ 2 là xấu. Sử dụng một hàm tạo. – BalusC

Trả lời

1

Đây không phải là một câu hỏi rõ ràng. Ý bạn là, bạn có muốn có hai phương pháp như setFoo(String)setBar(int) hoặc một phương pháp như setFooBar(String, int)? Nó thực sự phụ thuộc vào việc đây là những thuộc tính khác nhau về mặt logic, trong trường hợp đó bạn muốn các phương thức riêng lẻ, hoặc cho dù nó thường xuyên (hay chỉ) có ý nghĩa để đặt chúng lại với nhau. Bạn có thể cung cấp cả hai.

Không có bất kỳ tác động nào lên bộ nhớ, không.

3

Tôi không thể thấy hai phương pháp tiếp cận sẽ khác nhau như thế nào về trí nhớ.

Chọn phương pháp có ý nghĩa nhất trong giao diện của lớp học.

Tôi khuyên bạn nên đi với phương pháp tiếp cận 2 chỉ khi cả hai thuộc tính có liên quan chặt chẽ về mặt logic, hoặc nếu có một số biến thể lớp mà bạn không muốn tạm thời ngắt (ngay cả tạm thời).

Trong ví dụ Address của bạn, tôi chắc chắn sẽ đi với hai phương thức setter, vì khi nói về địa chỉ, tên và thành phố khá không liên quan.


Đối phương pháp nói chung Tôi muốn nói rằng có hay không bạn chia một phương pháp lên trong hai có ít ảnh hưởng đến tiêu thụ bộ nhớ. Mỗi đối tượng không có tập các phương thức riêng được phân bổ. Bộ nhớ chứa các phương thức được chia sẻ giữa tất cả các cá thể của một lớp.


Quy tắc chung: Cố gắng làm cho giao diện của lớp bạn trong sạch và hợp lý.

0

Bạn thường viết phương thức setter và phương thức getter cho mỗi thuộc tính.

Tôi không thực sự thấy trường hợp khi một phương pháp là đủ để đặt tất cả các thuộc tính. Trong trường hợp này, tất cả các thuộc tính phải có cùng giá trị? Hoặc bạn luôn phải chuyển các tham số cho tất cả các thuộc tính. Cả hai trường hợp không thực sự là những gì bạn muốn. Vì vậy, bạn nên rõ ràng thích cách tiếp cận đầu tiên của bạn.

2

Tại sao không sử dụng phương pháp # 2

ví dụ thứ hai của bạn là không nên vì nếu bạn bổ sung thêm một lĩnh vực mới để lớp Address, sau đó làm bạn thêm nó vào phương pháp setter hiện tại hoặc để bạn tạo một phương pháp setter mới? Nếu bạn thêm nó vào phương thức setter hiện có, thì bất kỳ lớp nào được gọi là phương thức đó sẽ bị hỏng.Và nếu bạn đã tạo một phương thức setter mới, thì nó sẽ gây nhầm lẫn cho bất kỳ ai muốn sử dụng lớp đó tại sao một số trường nhất định được nhóm lại với nhau theo cách đó trong khi những trường khác thì không.

Sử dụng một phương pháp setter riêng biệt cho từng lĩnh vực mà bạn muốn để lộ

Các thực tế phổ biến là phải có một phương pháp setter duy nhất cho mỗi trường trong lớp học của bạn mà bạn muốn để lộ (tức là ví dụ đầu tiên của bạn) . Có hay không đây là một thực hành tốt là gây tranh cãi bởi vì nó buộc một lớp là mutable. Tốt nhất là làm cho một đối tượng bất biến, nếu có thể, for a number of reasons.

Khởi tạo các lĩnh vực của bạn sử dụng một constructor

Một cách để làm cho một lớp học bất biến là bằng cách loại bỏ các phương pháp setter và thay vào đó đưa ra các lĩnh vực của bạn settable qua constructor lớp học của bạn, như dưới đây. Nhược điểm để thực hiện nó theo cách này là nếu lớp của bạn có nhiều trường, nó có khả năng dẫn đến các cuộc gọi hàm tạo lớn, không đọc được.

public class Address { 
    public String name; 
    public String city; 

    private Address(String name, String city) { 
     this.name = name; 
     this.city = city; 
    } 
} 

Khởi tạo các lĩnh vực của bạn bằng cách sử dụng mẫu Builder

Dưới đây là một việc thực hiện hoàn toàn thay thế (lấy cảm hứng từ this article) mà là một biến thể của mô hình Builder. Nó mô phỏng sự biến đổi đối tượng mà không bị mất khả năng đọc.

public class Address { 
    public String name; 
    public String city; 

    private Address() {} 

    private void setName(String name) { 
     this.name = name; 
    } 

    private void setCity(String city) { 
     this.city = city; 
    } 

    static class Builder { 
     private Address address = new Address(); 

     public Builder name(String name) { 
      address.setName(name); 
      return this; 
     } 

     public Builder city(String city) { 
      address.setCity(city); 
      return this; 
     } 

     public Address build() { 
      return address; 
     } 
    } 
} 

Với lớp trên, bạn có thể tạo ra một thể hiện bất biến của lớp Địa chỉ như sau:

Address address = new Address.Builder() 
     .name("Mansoor's address") 
     .city("Toronto") 
     .build(); 

cách tiếp cận nào sử dụng bộ nhớ nhiều hơn?

Từ điểm bộ nhớ, sẽ không có bất kỳ sự khác biệt nào do kích thước của một lớp trong bộ nhớ phụ thuộc vào các trường trong lớp. Vì cả ba cách triển khai đều có cùng các trường nên chúng sẽ lấy cùng một lượng không gian trong bộ nhớ, bất kể bạn sử dụng phương pháp nào.

+0

nó có nghĩa là chỉ có tôi đang yêu cầu cho phương pháp setter .. cho tôi biết về bất kỳ phương pháp – satheesh

+0

Bình luận về "phương pháp nói chung" khía cạnh trong câu trả lời của tôi. – aioobe

+0

Tôi không đồng ý với bạn câu trả lời. Tại sao thực hành phổ biến lại có người định cư cho từng lĩnh vực? Nhiều hơn thường có một lĩnh vực nội bộ trong một lớp học mà một trong những không muốn để lộ. Nơi duy nhất tôi biết nó là thực tế phổ biến là trong đậu. – Farmor

1

Tiêu chuẩn JavaBean phải có getters và setters cho mỗi thuộc tính: http://en.wikibooks.org/wiki/Java_Programming/Java_Beans. Nếu bạn không muốn thực hiện theo quy ước tiêu chuẩn đó, những gì có ý nghĩa nhất đối với cửa hàng của bạn. Theo các câu trả lời khác về chủ đề này, có lẽ là một vùng nhớ bộ nhớ tối thiểu, nếu có.

1

Nb.1 không nghi ngờ gì.

Và bạn không viết mã đó bằng tay, chỉ khai báo các trường của bạn.

Sau đó, bạn để Eclipse làm phần còn lại cho bạn.

Trong Eclipse sử dụng Nguồn -> tạo getters và setters.

Một cấu trúc tương tự như # 2 được thực hiện trong hàm tạo đối tượng.

Câu hỏi được cập nhật liên quan đến bộ nhớ. Đừng lo lắng một giây trong mã sản xuất cho sự khác biệt bộ nhớ giữa hai cách.

+0

Số 1 là thông lệ phổ biến, nhưng buộc một lớp có thể thay đổi được. –

+1

Ý bạn là gì? Sẽ không setAddress ("London", "Uk") và [setName ("Uk") setCity ("London")] có thể thay đổi bằng nhau? – Farmor

+0

Họ sẽ - không phải phương pháp nào là thích hợp hơn là những gì tôi đang nói. :) –

4

thực tế phổ biến là sử dụng JavaBean phong cách

class Address { 
    private String name; 
    private String city; 

    public setName(String name){ 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public setCity(String city){ 
    this.city = city; 
    } 

    public getCity() { 
    return city; 
    } 

}

Một thực tế phổ biến, đó là khá giống với bạn tiếp cận thứ hai là tạo ra đối tượng không thay đổi. Các tham số được truyền cho hàm tạo thay vì phương thức setter lớn.

class Address { 
    private final String name; 
    private final String city; 

    public Address(String name, String city) { 
     this.name = name; 
     this.city = city; 
    } 

    public String getName() { 
    return name; 
    } 

    public getCity() { 
    return city; 
    } 
} 

Từ điểm bộ nhớ, sự khác biệt sẽ là ví dụ thứ hai là đặt tất cả thuộc tính trong hàm tạo và tất cả các thuộc tính đó đều không thay đổi. Nói chung, đối tượng được xây dựng theo cách này an toàn hơn khi được sử dụng bởi nhiều luồng.

Trong ví dụ thứ hai, không cần đồng bộ hóa. Bạn sẽ cần phải xử lý các vấn đề về đồng bộ/bộ nhớ khi nhiều luồng sử dụng đối tượng JavaBean chuẩn.

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