2012-06-01 4 views
6

Знаете ли вы, ребята, как я могу сделать объект изменчивым только внутри специального класса? В этом примере я хочу, чтобы объект PrivateObject был только изменяемым (увеличивающимся) внутри класса Box, нигде больше. Есть ли способ получить это?java-like friend class механизм

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! 

В C++, я бы все свойства и методы PrivateObject частного и объявить класс Box в качестве друга для класса PrivateObject.

+1

связанный вопрос http://stackoverflow.com/questions/182278/is-there-a-way-to-simulate-the-c-friend-concept-in-java –

ответ

3

Если PrivateObject сильно связан с Box, почему бы не сделать его внутренним классом внутри 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(); 
    }  
} 

Теперь вы не можете назвать increment снаружи 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

Ближайшими будет сделать PrivateObject внутреннего класса Box и сделать increment частными. Таким образом, метод будет доступен только в классе 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++; 
     } 
    } 
} 

Если вы не хотите, чтобы сделать это, следующий вариант будет сделать increment пакет приватным и найдите 2 классов в одном пакете. Таким образом, только классы внутри этого пакета будут иметь доступ к этому методу. Но это может включать классы, отличные от Box.

3

В Java нет языкового эквивалента ключевого слова друга C++. Тем не менее, есть ряд альтернатив на уровне приложений:

  1. Объявите increment() метод PrivateObject класса, как пакет- приватным и определить Box в одном пакете.

ИЛИ

2. Пусть код вызова передать маркер в increment() - внутри этого метода проверки, если этот маркер действительно приходит из Box класса и разрешить или запретить.

Идея состоит в том, чтобы поддерживать связь между PrivateObject и Box классом управляемым.

1

В Java вы создадите группу «друзей», поставив несколько классов в один и тот же пакет. Затем используйте класс по умолчанию (без спецификатора доступа) для классов, методов и полей, к которым вы хотите ограничить доступ.