【问题标题】:What is best way to use instance of one class into another class without passing into constructor将一个类的实例用于另一个类而不传递给构造函数的最佳方法是什么
【发布时间】:2014-07-12 05:51:31
【问题描述】:

如果两个类在同一级别(都是子类),如何将一个类的实例用于另一个类。将一个类的实例用于另一个类而不传递给构造函数的最佳方法是什么? 所以手动要求传递 null。如何制作独立代码?

    Class PreviewPanel{

    private PreviewPanel(Builder builder) {
        this.previewMode=builder.previewMode;

        formsPreview=new NTFormsPreview(previewMode);
        formsPreview.setCanAddComment(builder.canAddComment);

        ntPreviewTreePanel=new NTPreviewTreePanel(builder,formsPreview);
    //This class have some event bus implemented.Sometime There, formsPreview instance is require.

           }
    public static class Builder {
        private PreviewMode previewMode;

        private Document document;
        public Builder(PreviewMode previewMode,Document document) {
            this.previewMode = previewMode;
            this.document=document;
        }
        public PreviewPanel build() {
              return new PreviewPanel(this);
        }

     }
}

如果我将该实例传递给构造函数,我必须遵循内部类的链并传递相同的实例以到达特定的类。我想避免它。这是大产品。要显示其中有多少类可以到达实际的处理程序实现并不容易。

代码结构:

private PreviewPanel(Builder builder)
    ->formsPreview=new NTFormsPreview(previewMode);

        ->NTPreviewTreePanel(builder,formsPreview);
                 ->NTPreviewTree(document, bidDocuments, previewMode, canAddComment,canViewComment, previewFormTxnEncryptionDetails,formsPreview);
             ->NTTreeNode(formsPreview)
                private void fireReportItemClicked(Document document,esenderCSReport){
                                eventBus.fireEventFromSource(formPreviewEvent, formsPreview);   
                }

【问题讨论】:

  • 您的问题不清楚。你想注入什么实例,在哪里注入? "As some time NTPreviewTreePanel is not required NTFormsPreview instance" 这句话充其量是模棱两可的。你能用明确的例子澄清一下吗?
  • 有什么方法可以将一个类的实例用于另一个类而不将实例传递给构造函数?
  • 你能不能只拥有一个你想在你设置的类上使用的类的公共属性?另一种选择是使用像 Unity 这样的 IoC 容器。
  • @JimGarrison 这与 gwt 事件总线查询有关。我使用了“eventBus.addHandler(type, handler)”处理程序。但它会触发不需要的事件,例如为同一类创建三个实例。如果我为一个班级触发事件,它会为所有三个班级触发。我发现解决方案“eventBus.addHandlerToSource”也可以传递实例(资源)。所以它会触发特定的实例。但情况并不总是一样。
  • 为什么不做一个简单的查询演示呢?为什么要发布与查询无关的问题的额外材料? -1 出于这个原因。请仅使用查询所需的相关详细信息编辑问题。 public class A extends C 就足够了,那么为什么用public class NTFormsPreview extends ScrollPanel 让这个例子如此复杂,然后无缘无故地覆盖方法:(

标签: java gwt design-patterns


【解决方案1】:

有什么方法可以将一个类的实例用于另一个类而不将实例传递给构造函数?

还有其他方法。

  • 使用setter 方法将第二个类的实例传递给第一个类。
  • 通过分配给第一个类中的实例变量,将第二个类的实例传递给第一个类。
  • 在第一个类中创建第二个类的实例。

如果您的答案与您的示例更相关,您需要更清楚地解释您在此处尝试做什么,以及为什么您认为您当前的解决方案不令人满意。


关于这个尝试的解释:

我必须遵循内部类链并传递相同的实例才能到达特定的类。我想避免它。

我不知道你想说什么。我怀疑其他读者也有同样的问题。

我怀疑这里真正的问题在于您现有代码的设计。看起来您/某人对嵌套类有点疯狂,并且您正在承受后果。简化事情的唯一方法可能是取消嵌套或重新考虑构造函数。 (为什么 private 构造函数需要一个“builder”参数?)


复杂的面向对象软件具有固有复杂的初始化模式是一种相当普遍的现象。往往没有巧妙的方法来以编程方式处理此问题,但您通常可以通过使用某种“依赖注入”(DI)机制来避免这种情况。它的另一个名称是“控制反转”(IoC)。

例如,Spring DI 的工作原理是向您的类添加注释,并让 Spring 以所需的形式创建和组装实例。或者您可以指定如何在 XML 中组装实例(bean)。

这可能是您的解决方案...

【讨论】:

  • 谢谢,我已经尝试把相关的结构。当我将实例传递给这个类时,我必须通过类和方法。所以不知道是好是坏!!
  • @TBM - 我认为我们无法进一步帮助您。解决方案(如果有的话)可能是针对您的问题的,而您的问题似乎太复杂而无法描述。
  • 为什么私有构造函数需要一个“builder”参数?因为builder类有这个方法。 public PreviewPanel build() {return new PreviewPanel(this);}
【解决方案2】:

我不清楚您的问题,但我认为您可以执行以下操作:

创建一个“拥有两个子类 - 组合”的新类

让它成为一种中介者模式,这样一个人就可以按照你想要的规则/逻辑在另一个人身上使用和调用东西。

  1. 无需以任何方式将其中一个孩子传给另一个孩子。
  2. 如果交互逻辑发生变化,请随意重新设计交互逻辑
  3. 无需“更改”您已有的结构

仅供参考,构建器似乎与构建器模式有关,您可能想阅读它,看看您是否能从项目中理解一些东西。

【讨论】:

  • 感谢“中介模式”的建议。让我检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多