2010-01-13 39 views
8

Tôi mới sử dụng Java và tôi muốn tạo một số biến lớp được tính động khi được truy cập, như bạn có thể làm trong Python bằng cách sử dụng phương thức property(). Tuy nhiên, tôi không thực sự chắc chắn làm thế nào để mô tả này, vì vậy Googling cho tôi thấy rất nhiều về Java "bất động sản" lớp học, nhưng điều này không xuất hiện để được điều tương tự. Tương đương Java của thuộc tính Python() là gì?Tương đương Java của thuộc tính Python() là gì?

+0

Cảm ơn bạn đã trả lời. Chỉ cần làm rõ, tôi biết Java thường khuyến khích bạn truy cập các thành viên thông qua getters và setters. Câu hỏi của tôi là nếu Java cho phép bạn truy cập vào một thành viên (ví dụ: obj.member) và gọi getter/setter đằng sau hậu trường, vì vậy hãy x = obj.member thực sự sẽ làm x = obj.getMember(). – Cerin

Trả lời

7

Không có cơ sở nào được xây dựng bằng ngôn ngữ Java. Bạn phải viết tất cả các getters và setters một cách rõ ràng của chính mình. Các IDE như Eclipse có thể tạo ra mã bản mẫu này cho bạn.

Ví dụ:

class Point{ 
    private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 

    public void setX(int x){ 
    this.x = x; 
    } 

    public int getX(){ 
    return x; 
    } 

    public void setY(int y){ 
    this.y = y; 
    } 

    public int getY(){ 
    return y; 
    } 
} 

Bạn có thể muốn có một cái nhìn tại Project Lombok cung cấp các chú thích @Getter@Setter có hơi giống với Python của property.

Với Lombok, ví dụ trên suy biến thành

class Point{ 
    @Getter @Setter private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 
} 
+0

Điều này gần hơn nhưng vẫn không cho phép các phương thức động để gọi khi một thuộc tính (được sử dụng như một thuộc tính) thay đổi. Dưới đây là một số mã python điều chỉnh nhiều thuộc tính đối tượng khác chỉ đơn giản là 'thiết lập' các uri: https://bitbucket.org/russellballestrini/miniuri/src/tip/miniuri.py –

+1

Bạn có thể tiếp tục thoát khỏi việc xác định hàm tạo được hiển thị ở trên bằng cách sử dụng @AllArgsConstructor. – Nik

0

Bạn có muốn tạo trường/getters/setters mới trong lớp không? Nếu bạn muốn làm điều này trong thời gian chạy, bạn phải tạo lớp hoàn toàn mới với các trường và các phương thức của bạn và tải nó vào JVM. Để tạo một lớp mới, bạn có thể sử dụng thư viện như ASM hoặc CGLib, nhưng nếu bạn mới sử dụng Java, đây không phải là thứ bạn muốn bắt đầu.

2

Họ không thực sự tồn tại. Trong Java, thực tế phổ biến là khai báo các thành viên là private hoặc protected và chỉ cho phép truy cập chúng thông qua các phương pháp. Thông thường, điều này dẫn đến rất nhiều phương thức getFoo()setFoo(newFoo) nhỏ. Python không thực sự có privateprotected và thông thường hơn là cho phép truy cập trực tiếp vào các thành viên.

1

Như những người khác đã lưu ý, java có getters và setters, nhưng không có analogon nghiêm ngặt. Có một thư viện của bên thứ ba có tên là Project Lombok tha sử dụng chú thích để tạo ra các getters và setters trong các tệp .class lúc comile. Điều này có thể được sử dụng để làm cho mọi thứ một chút ít tiết.

+3

-1, Khi bạn không có gì mới để thêm, bạn nên upvote câu trả lời đã tồn tại. –

+0

Việc bổ sung của tôi đã chỉ ra Dự án Lombok. GreyMatter 9.0 sau đó đã chỉnh sửa câu trả lời của mình để đưa nó vào. –

+0

Đừng đưa ra những lời buộc tội ngớ ngẩn. Thời gian chỉnh sửa câu trả lời của tôi (13:18) là trước thời điểm đăng câu trả lời của bạn (13:33). – missingfaktor

-1

Thực ra bạn có thể mô phỏng hành vi này trong Java.

CẢNH BÁO: giải pháp xấu xí dưới đây

Bạn có thể viết một phương pháp trong một lớp tiện ích như mã bên dưới:

public Object getProperty(String property, Object obj) { 
    if (obj != null && property != null) { 
     Field field = obj.getClass().getDeclaredField(property); 
     field.setAccessible(true); 
     try { 
      return field.get(obj); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 
    return null; 
} 

Bạn có thể thực sự tuyên bố nó như là một phương pháp tĩnh và sau đó chỉ cần nhập này phương pháp vào các lớp học của bạn mà sẽ cần hành vi này.

Nhân tiện, Groovy hỗ trợ tính năng này.

+0

Vui lòng đọc bài đăng của tôi chặt chẽ hơn. Tôi đã không tìm kiếm một chức năng để truy cập các thành viên cá thể. Tôi đã tìm kiếm một tính năng gọi một hàm khi tôi tham chiếu một thành viên thể hiện. ví dụ: myobj.attribute = 123; thực sự sẽ làm: myobj.setAttribute (123); – Cerin

3

hàm built() có sẵn hoàn toàn trái ngược với những gì được mô tả ở đây trong câu trả lời. nó không phải là về tạo ra getters và setters cho các biến thành viên. nó chỉ cho phép bạn gọi một phương thức bằng cách truy cập một thuộc tính (vì vậy, mặc dù bạn chỉ truy cập một biến trong lớp Python, một hàm sẽ được gọi). (this post giải thích cách thức và lý do sử dụng.)
điều này cho biết, Java không cung cấp bất kỳ thứ gì như thế này. thậm chí nhiều hơn, truy cập tài sản không được khuyến khích trong Java. tôi đoán bạn có thể làm điều đó trong ngôn ngữ kịch bản Groovy và siêu phép thuật mặc dù.nhưng tôi không biết làm thế nào để làm điều này.

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