如何在没有处理/ java eclipse项目中的构造函数的情况下访问其他类中的主类对象?

时间:2010-10-26 18:41:53

标签: java dependency-injection

我似乎无法在互联网上找到答案。

所以我在Eclipse中有一个处理项目

我希望能够访问我的“main”类中的对象,该类在另一个类中扩展PApplet,而不必通过构造函数传递它们。我不是最有经验的程序员,所以我的术语可能会关闭但希望这个例子澄清了我想要做的事情。

所以


public class Main Extends PApplet{

    //Example Class to access objects from main
    Interaction interaction;   

    //Example Objects I want
    boolean someObject;

    void setup(){        
        someObject = true;
        Interaction = new Interaction();  
    }

    void draw(){
    }   
}

public class Interaction{

    PApplet p;

    public Interaction(PApplet parent){
        p = parent;
    }

    public void mousePressed(){
        if(someObject){
            //do something
        }   
    }
}  

所以我知道我可以将该对象传递给Interaction的构造函数,如

PApplet p;
boolean o;

public Interaction (PApplet parent, boolean SomeObject){
    p = parent;
    o = someObject;
}

但是在这样的例子中有点疯狂,我只是想在自己的类中保持我的所有鼠标和键盘交互,因为它变得越来越大,但我已经遇到了这个时间和时间的需要。似乎无法弄明白。

2 个答案:

答案 0 :(得分:2)

您所描述的内容称为getter方法。

您可以为Main添加getter方法,但请先阅读此内容 - > http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

以下是示例。

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   PApplet p;

   public Interaction(PApplet parent){
      p = parent;
   }

   public void mousePressed() {

       if( p.getSomeObject( ) ) {
           //do something
       }

   }
}

BTW,boolean不是Java中的ObjectBoolean是。

修改 在您发表评论后,我明白了您的需求。

您需要创建interface并将此接口传递给Interaction构造函数。

此界面应提供Interaction所需的所有方法。如果它需要访问PApplet,那么这就是您的界面应该提供的内容。

考虑到这一点,这是一个新的层次结构:

public interface IInteractionContext
{
  boolean getSomeObject( );
}

public class Main
  extends PApplet
  implements IInteractionContext
{
  @Override
  public boolean getSomeObject ( )
  {
    return someObject;
  }

  ...
}

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   final IInteractionContext ctx;

   public Interaction(IInteractionContext ctx)
   {
      this.ctx = ctx;
   }

   public void mousePressed() {

       if( ctx.getSomeObject( ) )
       {
           //do something
       }

   }
}

如果InteractionctxMainPApplet,那么Unicorn可能会更少关注这些变化。它的构造函数请求预期的行为,Main的实现在运行时提供了这种行为。

无论如何阅读javaworld文章和相关文章。 另外,阅读有关Dependency Injection

的文章

答案 1 :(得分:1)

applet基本上是应用程序的顶级容器,为用户交互GUI /显示和输入(鼠标点击,键盘)提供上下文。

在设计良好的应用程序中,您的业务逻辑应该封装在一个或多个类中,您可以根据外部输入调用此方法,然后查询它以获取输出到GUI的信息。这非常概括BTW。

顶级容器(在本例中为Applet)应该只关注实例化业务对象,捕获用户输入,调用业务对象上的方法,然后根据业务对象的状态更新GUI。

我猜你有必要将所有交互代码包装到一个类中,以便为业务逻辑保持清晰。如果是这种情况,则应该封装业务逻辑,而不是通过Applet类传播。这样您就可以轻松地将业务对象转移到桌面应用程序,甚至可以在没有GUI的情况下运行它。