как реорганизовать или исправить циклическую ссылку в этом случае?Джава - PullRequest
1 голос
/ 29 июня 2011

Я прочитал родительский класс с именем MyClass code, подобный этому,

 public class MyClass extends CompositeObject{
    protected Map<String,MyAttibute> attributes = new       

    HashMap<String,MyAttribute>
    .....

 }

В MyAttribute Class, Code вроде этого

public class MyAttibute extends MyObject 
{
   private MyClass definedOnClass;//point to its parentClass

}

Это на самом деле круговая ссылка.когда вы делаете глубокую серлизацию и равных.И это может быть не очень хороший дизайн. Как этого избежать?И после исправления, мы все еще можем легко найти parentClass по его атрибуту.

PS Я вижу еще два дизайна классов

public class Transaction{
   private ChangeManager parentManager;
   ....
   public Transaction(ChangeManager parentManager)
} 

public class ChangeManager {
  //record transaction when commit
  private List<Transaction> transactions = new ArrayList<Transaction>();
  Transaction currentTransaction;
  ....  
}

Как вы думаете, этот тип дизайна хорош?Зачем?Как вы можете видеть, домены, которые определяют эти классы, довольно распространены.Так может кто-нибудь поделиться некоторым пониманием этого?Вредно ли сообщать Transaction свой ChangeManager и MyAttributes знать свой MyClass в своих свойствах?Любые комментарии приветствуются.Минусы и плюсы.

1 Ответ

0 голосов
/ 29 июня 2011

помещает MyAttibute как дочерний элемент, логически независимый от родителя, так что attr1.equals (attr2) не включает соответствующих родителей (то же самое с сериализацией; не включайте его в поток), и вы можете оставить свойство определенноеOnClass

или вы можете использовать другой метод equals при тестировании из MyClass

public class MyAttibute extends MyObject 
{
   private NgcClass definedOnClass;//point to its parentClass

   public boolean equals(Object o){
       if(o instanceof MyAttibute){
           MyAttibute other = (MyAttibute)o;

           if(!this.definedOnClass.equals(other.definedOnClass))
                return false;//when not from the same parent they are never the same

           return this.equals2(other);
       }
       return false;
   }

   //this one should then be called from MyClass
   public boolean equals2(MyAttibute o){
       //check equality without worrying about definedOnClass
   }
}

, обратите внимание, что сериализация по умолчанию для потоков объектов Java может обрабатывать циклические ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...