2012-12-02 27 views
5

thể trùng lặp:
Absence of property syntax in JavaTiếp cận sở hữu tư nhân mà không nhận/đặt

Xem tình huống sau đây:

class Test extends Object { 
    private int x; 
    public getX() {return x;} 
    public setX(int _x) {x = _x;} 
} 

Như bạn thấy, không có gì đặc biệt. Tuy nhiên, tôi muốn biết nếu có thể giữ "private x" theo cách mà ai đó sử dụng lớp không cần sử dụng getX(), nói cách khác, nếu tôi có thể ánh xạ một số biến tự động được gọi là nhận và đặt.

Giống như "thuộc tính" ở Delphi. Nó sẽ ngăn chặn sự cần thiết của việc sử dụng setX() và getX() trong một biểu thức phức tạp và sẽ làm giảm sự hiểu biết của người đọc biểu thức.

Ví dụ: giả sử một số nhận dạng xx và yy khác có thể được sử dụng thay cho phương thức get và set. Xem:

import Test; 
public static void main(String[] args) { 
    new Test() { 
     setX(10); 
     setY(20); 
     int z = getX() * getY() + (getY() * getY()); 
     System.out.println("%d", z); 
    } 
    // would be like this 
    new Test() { 
     xx = 10; 
     yy = 20; 
     int z = xx * yy + (yy * yy); // xx would access the method getX() automatically 
     System.out.println("%d", z); 
    } 
} 

Tôi hy vọng các bạn hiểu ý tôi ở đây.

EDIT:

Rolly crepe! Đó là rất nhiều câu trả lời! Cảm ơn bạn rất nhiều tất cả mọi người.

+1

Trong Java, bạn nên đặt biến riêng tư và truy cập bằng cách sử dụng get/set so với sử dụng trực tiếp. Bạn có thể thấy lợi thế với cách tiếp cận này nếu lớp con của bạn có cùng tên thuộc tính. – kosa

+1

hoặc nếu bạn có lý do chính đáng để không, chỉ cần công khai nó – NimChimpsky

+0

Hoặc bạn muốn nó là riêng tư, hoặc bạn không. Nếu bạn muốn nó là riêng tư, bạn không muốn truy cập vào các lớp khác. Nếu bạn muốn truy cập vào các lớp khác, đừng đặt nó ở chế độ riêng tư. –

Trả lời

13

Bạn không thể.

Đó là lý do tại sao chúng tôi nói trong "đóng gói". Chỉ khi bạn thay đổi hoặc sửa đổi từ riêng tư sang cái gì khác hoặc nếu bạn sử dụng sự phản chiếu (điều gì sẽ làm cho nó phức tạp hơn).

Tôi không thấy bất kỳ vấn đề nào trong việc sử dụng getters và setters nổi tiếng.

4

Tối đa, bạn có thể chuyển đổi private bằng protected để mọi thứ kế thừa có thể truy cập trực tiếp.

Nhưng yeah, bạn thực sự không thể. Thuộc tính này được liên kết với phương thức. Nó có thể thao các dấu ngoặc đơn() trong Java. Không có cách nào "chưa" để làm điều đó như thế này trong Java, nó phải là một loại con trỏ nào đó cho một phương thức.

2

Hãy suy nghĩ trong tương lai bạn sẽ không được phép nhập giá trị âm cho x người dùng sẽ sử dụng biến x của bạn. Trong trường hợp đó, bạn phải thay đổi setX với xác thực của bạn và những người đã sử dụng phương pháp đó sẽ không bị ảnh hưởng mà là đóng gói. Vì vậy, rất reccomand bạn sử dụng sử dụng getter công cộng và setter trong khi có tuyên bố tư nhân.

3

Có bộ thu thập và setter đã phá vỡ đóng gói trong tinh thần, do đó, đừng ngần ngại sử dụng các trường công cộng. Lập luận "một ngày sẽ đến khi bạn muốn xác nhận trong setter của bạn, và bạn sẽ cảm ơn bản thân cho quyết định có tầm nhìn xa để có chúng" âm thanh hợp lý khi đối mặt với nó, nhưng trong thực tế nó chỉ là câu chuyện của một đứa trẻ. Tôi đã viết vài nghìn người định cư trong sự nghiệp của mình; không bao giờ một phải được thêm xác nhận sau này. Nếu có xác nhận, nó luôn luôn xảy ra ở bên ngoài. Điều này tách riêng việc xác thực từ dữ liệu và cho phép các quy tắc khác nhau cho từng trường hợp sử dụng.

Một ý tưởng khác là giữ các phương pháp, nhưng hãy đặt tên thật ngắn: int x()void x(int x).

0

tôi sẽ cố gắng giải thích cho họ ...............

class Test extends Object

Trước hết bạn Đừng phải sử dụng Test extends Object. Bất cứ khi nào bạn don't or do explicitly extends your class to any other class, it will always extend the Object Class, directly or indirectly.

- Ok ngay bây giờ cho câu hỏi của bạn, Điều bạn thấy ở đây được gọi là Encapsulation ở dạng đơn giản và cơ bản nhất. Trong Java bạn không thể làm theo cách bạn làm điều đó trong Delphi or .Net.

15

bạn có thể truy cập họ, bằng cách sử dụng phản chiếu,

Test test = new Test() 
Field field = test.getClass().getDeclaredField("x"); 
field.setAccessible(true); 

System.out.println(field.getName() + "="+field.get(test)); 

nhưng, bạn không nên làm điều này

+0

"f" là gì? và tại sao tôi không nên làm điều này miễn là tôi chỉ đang kiểm tra lớp học? –

+0

@AbdalrahmanShatou tôi đã sửa mã của tôi, f phải là trường và x phải là đối tượng mà bạn đang đọc – user902383

+0

nếu bạn nhận được giá trị của trường riêng thông qua phản ánh để kiểm tra nó là ok – user902383

6

Tôi nghĩ rằng bạn đang cố gắng để lý tưởng hóa nó như C# thuộc tính, như mã sau đây, phải không ?:

public sealed class Example { 
    private int _code; 
    private string _name; 

    public Example(int code) { 
     this._code = code; 
    } 

    public int Code { 
     get {return this._code;} 
     set {this._code = value;} 
    } 

    public string Name { 
     set {this._name = value;} 
     get {return this._name;} 
    } 

    public override string ToString() { 
     return this._code.ToString(); 
    } 
} 

Đến nay trong Java Tôi tin rằng chúng tôi không có reso như vậy rt, nhưng tôi cũng không thấy gì sai khi sử dụng getters và setters.

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