【问题标题】:How to get a object which is instantiated inside a void method?如何获取在 void 方法中实例化的对象?
【发布时间】:2013-03-14 15:08:20
【问题描述】:

问题是我有 2 节课。第一类有一个创建第二类对象的方法。是否可以在没有返回语句的情况下获取该对象?也不让它成为一个领域

例子:

//头等舱

public class First {

    public First() {
    }

    public void aMethod(Object o) {
        Second s = new Second(o);
    }
}

//二等

public class Second {

    public Second() {
    }
}

通过单击按钮调用该方法。

编辑: 很抱歉造成混乱。但是我不想更改代码的原因是因为我正在做一个 JUnit 测试。

这两个类实际上是 jFrames,我正在尝试测试按钮。 在第一类中,该方法通过按钮调用。在该方法中,它创建了第二个 Jframe。在这个 Jframe 中,我还想测试一个按钮,这就是为什么我需要实例化的 jFrame 对象。 在 aMethod() 中,我还传递了第二个 JFrame 需要的一些参数。所以我不能单独测试它。

【问题讨论】:

  • aMethod() 可以有参数吗?
  • 你问的问题没有真正的意义——如果你想在First之外使用它,为什么你不想返回s?请您编辑您的问题以解释您想要实现的什么,而不是您认为应该实现的如何
  • 没有返回,没有字段(所以静态或非静态变量对吗?)那么我想我能想到的唯一方法是反射,我认为这不是正确的方法......但是我不认为这真的是你想要的......
  • @cwhsu 您可以通过改变传递给方法的参数来实现(基本上是一个类,它只是Second 的包装器)。我认为这就是肯特所暗示的。但是 - 我认为这个要求没有意义,因此我觉得作者应该澄清他的意图。

标签: java variables methods


【解决方案1】:

我能想到的有两种可能:

1) 在aMethod() 中添加参数,例如List list (or other types has Second Field),然后你可以list.add(new Second()) 调用者可以从列表中获取它(最后一个元素)

2) 另一个类(如果有的话),有一个静态字段private static Second second,而且你要写setter/getter,还要关心线程安全的问题……那你可以在aMethod()Foo.setSecond(new Second());在实践中真的糟糕

最后,我会问,你真的需要这样做吗??

【讨论】:

    【解决方案2】:

    这完全取决于您的 First 对象是/需要的线程安全程度。

    您可以设置一个实例变量,然后公开一个 getter,但也许您正试图在其他一些约束中工作,因为这似乎是仅返回值的一种非常奇怪的替代方法。

    public class First {
        private Second s;
        public First() {
        }
    
        public void aMethod() {
             s = new Second();
        }
    
       public Second getSecond(){
            return s;
       }
    }
    

    编辑:另一个答案,因为我以某种方式错过了无字段约束。

    您可以使用 Observable 模式,以便您的客户端 Object 注册为 First 的侦听器,然后您就可以这样做;

    Second s = new Second();
    setChanged();
    notifyObservers(s);
    

    http://docs.oracle.com/javase/6/docs/api/java/util/Observable.html

    这似乎有点矫枉过正,也许您可​​以提供更多关于您无法编辑方法签名或使用字段的原因的上下文。

    【讨论】:

    • "... And also not making it a field"
    • 哦,是的,不知道我是怎么错过那个杜克林的。
    【解决方案3】:

    您也可以在传递给方法调用的参数中返回它。 类似:

        public void aMethod(Result result) {
                 s = new Second();
                 result.val = s;
            }
    

    其中 Result 可能是具有 Second 类型成员的类。 或者可能是一个通用类:

    Result<Second>
    

    但我不确定这会比简单的回报更好。

    【讨论】:

      【解决方案4】:

      最常见的是使用所谓的工厂模式

      public class First {
      
      public First() {
      }
      
      public Second aMethod(Object o) {
          return new Second(o);
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        相关资源
        最近更新 更多