2012-06-01 23 views
6

Bạn có biết làm thế nào tôi có thể làm cho một đối tượng thay đổi chỉ trong lớp học đặc biệt? Trong ví dụ này tôi muốn đối tượng PrivateObject chỉ có thể thay đổi (gia tăng) bên trong lớp Box, không nơi nào khác. Có cách nào để đạt được điều này?java -like cơ chế lớp bạn bè

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 

    } 

} 


public class PrivateObject { 
    private value; 
    public increment(){ 
     value++; 
    } 

} 

PrivateObject priv = new PrivateObject(); 
Box box = new Box(); 
box.setPPrivateObject(priv); 
box.changevalue(); 
priv.increment(); //i dont want it to be changable outside the Box class! 

Trong C++, tôi sẽ đặt tất cả thuộc tính PrivateObject thành phương thức riêng tư và khai báo lớp Box làm bạn cho lớp PrivateObject.

+1

câu hỏi liên quan http://stackoverflow.com/questions/182278/is-there-a-way-to-simulate-the-c-friend-concept-in-java –

Trả lời

3

Nếu PrivateObject liên quan chặt chẽ đến Box tại sao không biến nó thành lớp bên trong bên trong Box?

class Box { 

    public static class PrivateObject { 
     private value; 

     private increment(){ 
     value++; 
     } 
    } 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 
    }  
} 

Bây giờ bạn không thể gọi increment từ bên ngoài Box:

public static void main(String args[]) { 
    Box.PrivateObject obj = new Box.PrivateObject(); 
    Box b = new Box(); 
    b.setPrivateObject(obj); 
    obj.increment(); // not visible  
} 
3

Gần nhất sẽ được thực hiện PrivateObject một lớp bên trong của Box và làm increment tin. Bằng cách đó, phương thức này sẽ chỉ có thể truy cập trong lớp Box.

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p) { 
     prv = p; 
    } 

    public void changeValue() { 
     prv.increment(); 

    } 

    public static class PrivateObject { 

     private int value; 

     private void increment() { 
      value++; 
     } 
    } 
} 

Nếu bạn không muốn làm điều đó, tùy chọn tiếp theo sẽ là đặt gói increment riêng tư và định vị 2 lớp trong cùng một gói. Bằng cách đó, chỉ các lớp trong gói đó sẽ có quyền truy cập vào phương thức đó. Nhưng điều đó có thể bao gồm các lớp khác ngoài Box.

3

Java không có bất kỳ tính năng ngôn ngữ nào tương đương với từ khóa bạn bè của C++. Tuy nhiên, có số lựa chọn thay thế ứng dụng cấp:

  1. Khai báo phương pháp increment() của lớp PrivateObject như package- tin và xác định Box trong cùng một gói.

HOẶC

2.Let mã gọi thông qua một mã thông báo vào increment() - bên trong kiểm tra phương pháp này nếu dấu hiệu này thực sự là đến từ Box lớp và cho phép hoặc không cho phép.

Ý tưởng là giữ cho khớp nối giữa các lớp PrivateObjectBox có thể quản lý được.

1

Trong Java, bạn sẽ tạo một nhóm "bạn bè" bằng cách đặt nhiều lớp trong cùng một gói. Sau đó, sử dụng phạm vi mặc định (không có trình chỉ định truy cập) trên các lớp, các phương thức và các trường bạn muốn hạn chế quyền truy cập.

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