Java вложенные и / или дочерние классы - PullRequest
1 голос
/ 06 февраля 2010

Мне было интересно, какие лучшие практики были в java при запуске вложенного класса - я думаю о запуске сервера rmi, который будет создан при создании родительского класса, так что, скажем,

class foo() [the 'parent']
constructor for foo() - instanciates rmifoo()

это становится немного больно, когда вы хотите вызвать метод из rmifoo () обратно в класс 'parent' (вы не можете просто импортировать класс из-за rmi). один из способов, конечно, сделать rmifoo () фактическим дочерним классом, а затем иметь возможность доступа к методам в родительском элементе, но это кажется ненужным OTT (особенно потому, что тогда, по-видимому, вам нужно сделать родительский абстракцию и т. д. усложняет много других функций).

Мне было интересно, как лучше всего настроить систему, подобную этой, чтобы можно было вызывать методы обратно в классе foo () из его сервера, т.е. rmifoo ()

********* обновление *******

Код (как я сейчас думаю) будет примерно таким:

A.java:

public class A {
B aBinstance;

  public fooParent() {
  [do something..]
  }
}

B.Java

public class B { 
  public fooChild() {
   [super].fooParent()  (super wont work...?)
  }

}

Ответы [ 3 ]

0 голосов
/ 06 февраля 2010

Я думаю, что вы действительно спрашиваете, является ли хорошей идеей использовать вложенные классы Java для реализации отношений содержания в (концептуальной) объектной модели вашего приложения; как в ...

public class A {
    public class B { 
        public A getParent() {
            return A.this;
        }
    }
}

Я склонен думать, что это не очень хорошая идея:

  • Этот подход нарушается, если отношения рекурсивные. Например, если A может содержать B, а B может содержать A, вы не можете и сделать B вложенным классом A, и A вложенным классом B.

  • Подход не позволяет создавать экземпляр B независимо от A или перемещать его из одного экземпляра в другой.

Кроме того, хотя этот подход обрабатывает переход от ребенка к родителю, он не обеспечивает переход от родителей к детям. Вам все равно придется реализовать это явно; например с таким атрибутом, как

 private List<B> children;

в классе А.

Я думаю, что, как правило, лучше (например, более гибко) реализовывать A и B как отдельные не вложенные классы и использовать явные атрибуты parent и / или chidren (при необходимости) для представления отношения содержания. *

0 голосов
/ 06 февраля 2010

Я думаю, это то, что вы пытаетесь сделать:

public class A {

   private B b;

   public A() {
      b = new b(this);
   }

   public aMethodInA() {
      //stuff goes here
   }
}


public class B {

   private A a;

   public B(A a) {
      this.a = a;
   }

   public aMethodCallingMethodsInTheObjectThatInstantiatedMe() {
      a.aMethodInA();
   }
}

Это выполнимо и очень полезно в некоторых случаях, но в итоге вы получаете эти циклические ссылки, и это то, чего вы обычно хотите избежать. Подумайте, почему вам нужно вызывать класс A из B. Может быть, есть способ разделить вашу проблему на три класса и разбить ваши циклические ссылки таким образом.

0 голосов
/ 06 февраля 2010

Если rmifoo является внутренним классом внутри foo, то он может напрямую обращаться к методам в foo.

[РЕДАКТИРОВАТЬ]: Это применимо, только если класс rmifoo не является static inner class, и в этом случае он будет иметь доступ только к статическим методам в foo.

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