我一直在试图找出如何从不同类的类实例中调用方法而心烦意乱。例如:
public class Test1
{
public static void makeSomeInst()
{
Test1 inst = new Test1();
inst.fireTest();
}
public void fireTest()
{
System.out.println("fireTest");
}
public Test1()
{
}
}
理解上面的内容没问题,但是如果我想做一些事情来从名为Test2的类中安装,我该怎么做?下面的示例不起作用:
public class Test2
{
public static void main(String[] args)
{
Test1.makeSomeInst();
inst.fireTest();
}
}
为了更加清楚,我知道无需实例化就可以调用静态引用,但在这种情况下我只是想知道
从Test2类中引用名为 inst 的test1对象的语法是什么?
答案 0 :(得分:4)
如果我想从名为Test2的类中进行安装,该怎么办?
首先,您必须教Test2
类Test1
是什么。
public class Test2
{
public doSomething()
{
inst.fireTest();
}
public Test2(Test1 inst)
{
this.inst = inst;
}
private Test1 inst;
}
然后教导inst2
对象inst
是什么。
public class Test1
{
public static void main(String[] args)
{
Test1 inst = new Test1();
Test2 inst2 = new Test2(inst); // <- new code
inst2.doSomething(); // <- new code
}
public void fireTest()
{
System.out.println("fireTest");
}
public Test1()
{
}
}
您只需要一个主电源即可开始演出。控制流仍然可以通过其他对象。但是在这一点上,我将不称这些独立测试。我只是用这个名字来匹配您的代码。
您正在查看的是称为引用传递的东西。它的合适术语是Pure Dependency Injection * 。基本模式是在main中构建对象图。构建完成后,请在一个对象上调用一个方法以开始整个过程。
在主程序中,您将构建每个与程序一样有效的对象。您不会在此处找到的对象是后来出生的对象,例如时间戳。一条好的经验法则是在进行任何实际工作之前先构建这些寿命长的对象。由于他们彼此了解,因此可以在他们之间来回传递控制流。那里有很多功能,如果使用不当,可能会造成混乱。仔细研究Architectural Patterns。
此处遵循的原则是separate use from construction。接下来,您可以轻松地改变主意,一言以蔽之。当设计更改不会迫使您重写所有内容时,这很好。
答案 1 :(得分:2)
您必须将实例保存在某处。 如果Test1应该是单例,则可以执行以下操作:
public class Test1
{
private static Test1 instance;
public static Test1 getInstance()
{
return instance == null ? instance = new Test1() : instance;
}
public static void main(String[] args)
{
Test1 inst = getInstance();
inst.fireTest();
}
public void fireTest()
{
System.out.println("fireTest");
}
}
和在Test2中:
public class Test2
{
public static void main(String[] args)
{
Test1.getInstance().fireTest();
}
}
//编辑
正如我刚刚从@Thomas S.评论中学到的,单例并不是一个好的解决方案。 请参阅@candied_orange的答案以获得更好的实现。