Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给出从已创建对象形成对象的参考_Java_Reference - Fatal编程技术网

Java 给出从已创建对象形成对象的参考

Java 给出从已创建对象形成对象的参考,java,reference,Java,Reference,执行以下操作的最佳方法是什么: 我有一个类a,它从类B创建并保存对象。类B的对象在做自己的事情,有时他必须调用父对象(类a)的方法。我听说在对象B中保存对象a的引用不是最好的主意(代码片段中显示了这个想法) 这样做真的不好吗?有更好的方法吗?据我所知,您的类B就像一种代理或装饰程序,区别在于a和B不共享任何公共接口。如果您的设计要求类B像这样工作(代理、装饰等),最好的方法是定义一个公共接口:B实现a的接口并可以“模拟”它:在这些情况下,共享对“代理”类的引用并不坏,实际上是必需的。例如: pu

执行以下操作的最佳方法是什么:

我有一个类a,它从类B创建并保存对象。类B的对象在做自己的事情,有时他必须调用父对象(类a)的方法。我听说在对象B中保存对象a的引用不是最好的主意(代码片段中显示了这个想法)


这样做真的不好吗?有更好的方法吗?

据我所知,您的类B就像一种代理或装饰程序,区别在于a和B不共享任何公共接口。如果您的设计要求类B像这样工作(代理、装饰等),最好的方法是定义一个公共接口:B实现a的接口并可以“模拟”它:在这些情况下,共享对“代理”类的引用并不坏,实际上是必需的。例如:

public interface A {
 void methodA();
}
public class AImpl implements A {
  @Override
  public void methodA() { /* .... */ }
}
public class AProxy implements A {
  private final A a; // Use the interface not the implementation
  public AProxy(final A a)  { this.a = a; }
  @Override
  public void methodA() {
     /* .... */
     a.methodA();
     /* .... */
  }
}
另一种方法是,您定义一个层次结构,其中A是B的父级,因此B“需要”了解A才能工作,或者相反,A和B具有1对1的E-R依赖关系:您可以遵循复合设计模式(主要在ORM技术上被滥用)或依赖关系注入模式。在ORM技术中,父母和孩子总是相互参照,但他们彼此独立行动

// It might be an @Entity
public class A {
   private B child;
   /* setter and getter */
}

// It might be an @Entity
public class B {
   private A parent;
   /* setter and getter */
}
在依赖项注入中,您可以选择使用带有私有final字段及其构造函数参数的类(或多或少与您相同)或使用私有字段及其setter来强制这种关系

public interface A {
 void methodA();
}

public class AImpl implements A {
  @Override
  void methodA() { /* .... */ }
}

public class B { // B does not implement A!
  private final A a; // Use the interface not the implementation
  public B(final A a) { this.a = a; }
  public void methodB() { /* ... */ }
}


共享父对象/外部对象的引用不是问题,而是取决于您的设计要求,您必须相应地对应用程序建模。在我的第一个示例中,B实现了A的接口,而在后一个示例中,B的行为类似于A,B不实现A的接口,依赖于A:这有细微但重要的区别。

这在很大程度上取决于您尝试做什么!但是,你可能想考虑<代码>类B >代码>扩展<代码>类A<代码>。它们只是引用,不担心它不会复制你的对象,如果这是你关心的。我知道,它并不真的影响性能,但是我只是听说这不是从架构上看的好方法。考虑使用接口,ie为A中在B中使用的所有方法创建接口,让A实现您的接口,并将该接口作为参数传递给B构造函数。这听起来可能很混乱,但我认为这可能是更好的设计。但总的来说,我认为你的问题可能有点宽泛
public interface A {
 void methodA();
}

public class AImpl implements A {
  @Override
  void methodA() { /* .... */ }
}

public class B { // B does not implement A!
  private final A a; // Use the interface not the implementation
  public B(final A a) { this.a = a; }
  public void methodB() { /* ... */ }
}
public class B { // B does not implement A!
  private A a; // Use the interface not the implementation and it is not final
  /* setter and getter */
}