2009-12-15 43 views
52

Có cách nào tốt hơn để tạo các getters và setters trong Java?Getters và Setters Java

Khá rõ ràng khi phải xác định rõ ràng getters và setters cho từng biến. Có cách tiếp cận chú thích chuẩn tốt hơn không?

Spring có giống như thế này không?

Ngay cả C# cũng có thuộc tính.

+16

Nó có thể không phải là những gì bạn muốn nghe nhưng hầu hết IDE có thể tạo ra chúng cho bạn. –

+0

Để trả lời phần Xuân của câu hỏi: Không, không thực sự. Bên cạnh đó, sau khi "lập trình" XML cho một vài ngày, bạn sẽ cầu xin cho niềm vui của mã hóa gọn gàng, ngắn gọn getters và setters một lần nữa :) –

+0

Đúng tôi nếu tôi sai nhưng bạn vẫn cần phải viết C# thuộc tính không bạn? Nó không giống như chúng được ngụ ý và bạn chỉ cần viết chúng nếu bạn muốn mở rộng hành vi đọc/ghi-một-biến cơ bản. Điều duy nhất họ có trên getters và setters là nó giữ chúng side-by-side. – David

Trả lời

18

Eclipse có tùy chọn menu ngữ cảnh sẽ tự động tạo các tùy chọn này cho bạn, vì tôi chắc chắn nhiều IDE khác làm.

+1

Nếu bạn định bỏ phiếu cho tôi, ít nhất là cung cấp lý do. – Ascalonian

+2

Không thực sự là giải pháp tốt nhất, nhưng đó là những gì chúng tôi giới hạn. – WhyNotHugo

+2

bất cứ lúc nào tôi thực hiện một thay đổi cho một cái gì đó với một loạt các lĩnh vực, tôi chỉ cần xóa các getters và setters và có eclipse tái tạo tất cả. Đó là tiếng ồn. – gtrak

3

Hầu hết các IDE cung cấp một phím tắt để tạo ra mã (ví dụ Eclipse: Nhấp chuột phải -> Source -> Generate Getters & Setters), mặc dù tôi nhận ra điều này có lẽ không phải là câu trả lời bạn đang tìm kiếm.

Một số khung IOC cho phép bạn chú thích các thuộc tính để chúng có thể được sử dụng trong ngữ cảnh của khuôn khổ, ví dụ: Tấm thảm IOC, và mùa xuân mới nhất, tôi nghĩ (nhưng việc sử dụng này bị hạn chế sử dụng bởi khung công tác)

1

Vâng, bạn là loại may mắn. Groovy không tạo ra chúng cho bạn, nhưng không có xúc xắc trong java chuẩn. Nếu bạn sử dụng Eclipse, bạn có thể generate them pretty easily, cũng như tạo hàm hashCode() và equals().

58

Tôi không chắc liệu bạn có coi đó là 'chuẩn' hay không, nhưng Project Lombok giải quyết vấn đề này. Họ sử dụng chú thích để thay thế phần lớn tính từ của Java.

Một số người đang xem các ngôn ngữ anh chị em thay thế Java, chẳng hạn như Groovy hoặc Scala. Tôi e rằng nó sẽ mất một vài năm - ngay cả trước khi JSR đưa ra một cách "chuẩn hóa" để "sửa" điều này trong Java một cách thích hợp.

+8

+1: Lombok là một bổ sung tốt đẹp, và cũng có thể chăm sóc hashCode, bằng & toString .. Giá trị một cái nhìn cho các lớp dữ liệu ngu ngốc .. – Tim

+2

+1 để Lombok là rất mát mẻ, nhưng -1 cho bản chất là IDE cụ thể. Bất kỳ IDE khác và bạn nhận được một khối lượng các lỗi trang trí mã như IDE doeesn't biết những gì đang xảy ra. Tôi cũng không hoàn toàn chắc chắn cách nó hoạt động với các trình gỡ rối. –

+1

Nó hoạt động tốt với Maven là tốt, và họ chỉ cần thêm một tùy chọn de-lombok tạo mã nguồn mà không có bất kỳ tham chiếu đến lombok. – Tim

3

Dưới đây là một bài viết thú vị về chủ đề này: http://cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

Tôi nghĩ rằng tính chất này là một phím tắt nhưng nó hơn một tính năng ít hơn so với một tính năng quan trọng thực

+1

Tôi đã dành một vài năm phát triển ở Delphi. Tôi luôn coi tài sản là một trong những tính năng tốt nhất của Delphi. Tôi luôn buồn vì Java không có tính năng này. Anders Hejlsberg đã xây dựng các đặc tính thành C# và giờ đây các MS có chúng và chúng ta không có. Nó có thể là một tính năng "nhỏ" nhưng bất cứ điều gì mà cắt giảm xuống mã cắt giảm trên các lỗi và làm tăng khả năng hiểu. –

+1

Jerome - Tôi không đồng ý. Ràng buộc trong Java hiện đang bị tê liệt b/c thiếu hỗ trợ. Hãy tưởng tượng nếu bạn không thể có được thành viên .class tĩnh, nhưng thay vào đó phải làm việc với việc truyền các chuỗi xung quanh. Tôi tiếp tục thấy mọi người viết rằng các thuộc tính trong ngôn ngữ sẽ chỉ là cú pháp đường, nhưng điều đó không phải như vậy. –

2

Với Netbeans, chỉ cần bắt đầu gõ được hoặc thiết lập nơi getter/setter được thay thế và gọi tự động hoàn thành (Ctrl + Space), nó sẽ cung cấp cho bạn tùy chọn để tạo getter hoặc setter. Nó cũng sẽ cung cấp cho bạn một tùy chọn để tạo ra một hàm tạo.

+0

Eclipse cũng có một cái gì đó tương tự. –

+0

Và IntelliJ IDEA cũng vậy. Điều đó làm cho 3 IDE Java chính bạn có thể sử dụng để giải quyết vấn đề. –

1

Không có cách nào tốt hơn là một phần của ngôn ngữ - không có gì giống như từ khóa "thuộc tính".

Một cách khác, như những người khác đã đề cập, là sử dụng IDE của bạn để tạo chúng. Một trường hợp khác, nếu bạn có rất nhiều đối tượng cần điều này, hãy viết công cụ tạo mã của riêng bạn để có lớp cơ sở và tạo trình bao bọc bằng getters và setters.

Bạn cũng có thể chỉ hiển thị các biến là thành viên công khai. Tuy nhiên, xuống con đường này có thể sẽ trở lại làm tổn thương bạn, khi bạn quyết định thêm logic xác nhận.

Tuy nhiên, một suy nghĩ cuối cùng: trừ khi các lớp học của bạn được sử dụng chỉ đơn giản là để chuyển dữ liệu, họ có lẽ không nên để lộ trạng thái nội bộ của chúng. IMO, "hành vi" các lớp học với getters và setters là một mùi mã.

2

Có thể thay thế, bạn đã thử Scala chưa?Nó biên dịch sang Java bytecode, và có rất nhiều phím tắt thú vị có thể làm cho cuộc sống của bạn trở thành một lập trình viên Java dễ dàng hơn.

Thuộc tính ví dụ:

case class Person(var name:String, 
        var age:Int); 
val p = Person("John", 4) 
p.name 
p.name = "Charlie" 
p.name 

Và kết quả:

defined class Person 
p: Person = Person(John,4) 
res7: String = John 
res8: String = Charlie 
+1

Thay đổi công nghệ. – Sylar

+0

Về mặt kỹ thuật Java là một tập hợp con của Scala, do đó vấn đề có thể được giải quyết bằng cách sử dụng phương pháp này. –

+4

Tôi ở bên bạn theo ý thích Scala (và do đó đã thăng hạng bạn trở về 0) nhưng "bạn đã thử Scala chưa?" đang hỏi một chút. Scala mang sự tương đồng với Java, nhưng sự khác biệt lớn đến mức tôi đã thử một lúc để "viết mã Java trong Scala" và bỏ cuộc. Trong khi đó là một niềm vui để mất getters/setters, Scala đòi hỏi một cam kết vững chắc. –

0

Đó là công việc của IDE để tạo ra mã tiết lặp đi lặp lại như getters/setters

+3

Tôi không đồng ý, nhưng tôi cảm thấy đó là dấu hiệu của sự yếu kém trong ngôn ngữ khi tạo mã được yêu cầu để thực hiện các tác vụ lặp đi lặp lại. Nếu IDE đủ thông minh để làm điều đó cho bạn, ngôn ngữ cũng nên như vậy! –

+0

IDE không đủ thông minh để làm điều đó, nó tạo ra mã nếu và chỉ khi bạn quyết định cung cấp getters và/hoặc setters, và chỉ cho các biến cá thể mong muốn. Theo mặc định, tất cả các biến không thể đọc được/sửa đổi nếu không được khai báo công khai. Về verbosity, Java cung cấp nhiều hơn đọc/modif đơn giản của các biến này, nhưng có thể thực hiện một số logic trước khi sửa đổi hoặc trả về một giá trị tương ứng với biến, một lần nữa chỉ khi bạn quyết định. – user225486

+0

Tại thời điểm này, bạn đang mâu thuẫn với câu trả lời của riêng bạn. Bạn đang nói đó là công việc của người sử dụng để nói với IDE để tạo ra mã tiết đoạn lặp đi lặp lại. Chắc chắn, đó chính xác là cách nó hoạt động, và tôi cảm thấy nó rất xấu. Delphi, Ruby và các ngôn ngữ khác cho phép bạn sử dụng các từ khóa đơn giản để tự động tạo các getters và setters đơn giản trong khi * vẫn * cho phép bạn tự do thêm test, hiệu ứng phụ, abstractions hoặc bất cứ thứ gì bạn muốn, nếu bạn muốn. –

0

Sử dụng IDE của bạn để tạo ra nó cho bạn và cố gắng giảm thiểu số lượng getters/setters mà bạn có - bạn sẽ có thể tận hưởng lợi ích bổ sung của bất biến.

Tôi thích cú pháp C# cho thuộc tính, tôi nghĩ rằng nó đẹp và sạch sẽ, và khá sạch sẽ.

0

Vâng, một tùy chọn không quá sợ các trường công khai. Đối với các lớp đơn giản mà bạn biết sẽ không bao giờ làm xác nhận hoặc làm việc thêm dưới mui xe trên nhận và thiết lập, các lĩnh vực công cộng đòi hỏi ít boilerplate, là cú pháp đẹp hơn, và hiệu quả hơn.

+1

chúng không hiệu quả hơn vì điểm phát sóng biết cách nội tuyến và cài đặt – gtrak

6

Tôi đã tạo một số chú thích không chuyên biệt về nhật thực.

Xem http://code.google.com/p/javadude/wiki/Annotations

Ví dụ:

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

chú thích của tôi tạo ra một lớp cha; Tôi nghĩ Lombok sửa đổi lớp thực tế đang được biên dịch (chính thức không được Sun hỗ trợ và có thể bị phá vỡ - tôi có thể sai về cách nó hoạt động, nhưng dựa trên những gì tôi thấy họ phải làm)

Hãy tận hưởng! - Scott

0

Nếu bạn sử dụng emacs, bạn có thể xác định macro emacs thực hiện điều này cho bạn. Bất kỳ emacs gurus ra khỏi đó? :)

3

Tôi đồng ý rằng getter/setters là tiết. Project Lombok có câu trả lời hay cho những người khác. Nếu không, bạn có thể sử dụng khả năng của IDE để tạo ra chúng.

2

Ngoài ra còn có dự án Spring Roo với chú thích @RooJavaBean của nó. Nó cũng có @RooToString và @RooHashCodeEquals hoặc một cái gì đó tương tự. Nó tạo ra trong nền một tập tin AspectJ với các phương pháp thích hợp.

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