Java中没有带getter和setter的静态变量的对象通信



我有一个JPanel,当鼠标指针移动时,我会在其中跟踪鼠标指针的位置。我把它储存在一些田地里。如何访问getter来读取另一个对象中已经创建的对象的字段?

这只是一个例子,我很难在不使用静态变量的情况下获得对象通信。

部分代码:

class MainPanel extends JPanel implements MouseMotionListener {
public int mouseX, mouseY
public MainPanel(){
this.addMouseMotionListener(this);
...
}
public void mouseMoved(MouseEvent e) {
this.MouseX = e.getX();
this.MouseY = e.getY();
}
public int getX(){
return this.MouseX;
}
public int getY(){
return this.MouseY;
}
...
}
}
class Something{
*** I want to, for example, print on console the XY coordinates of the -object-
MainPanel. ****
}
}

谢谢!

有几种可能的解决方案。

实例范围

如果您需要从Something范围访问MainPanel(即,Something中的几个方法将使用MainPanel,而MainPanel中的中间状态很重要)。

将您的MainPanel实例传递给Something

使用构造函数:

如果Something在没有MainPanel的情况下无法完成其工作:

class Something {
private final MainPanel mainPanel;

public Something(MainPanel mainPanel) {
this.mainPanel = mainPanel; 
}
public void myMethod() {
System.out.printf("Mouse cordinates: %d x %dn", mainPanel.getX(),
mainPanel.getY());
}
}

初始化代码:

MainPanel mainPanel = new MainPanel();
// ... put panel in frame, etc
Something something = new Something(mainPanel);

使用setter:

如果Something即使没有MainPanel:也能完成它的工作

class Something {
private MainPanel mainPanel;

public void setMainPanel(MainPanel mainPanel) {
this.mainPanel = mainPanel
}
// my other methods
}

初始化代码:

MainPanel mainPanel = new MainPanel();
// ... put panel in frame, etc
Something something = new Something();
something.setMainPanel(mainPanel);

方法参数

如果在方法的作用域中只需要MainPanel的状态(不希望在Something中保留对MainPanel的引用),则可以在需要的地方传递MainPanel的实例。这是独立方法的最佳策略。即使Something中的几个方法需要访问MainPanel,也没有必要将MainPanel存储为字段,除非这些方法以某种方式"是";一起工作";关于MainPanel:的一个实例

public void myMethod(MainPanel mainPanel) {
System.out.printf("Mouse postion: %d x %dn", mainPanel.getX(),
mainPanel.getY());
}

用法示例:

MainPanel mainPanel = new MainPanel();
Something something = new Something();
something.myMethod(mainPanel);

最后,除了考虑变量范围之外,还应该考虑API真正需要什么才能工作。Something需要访问MainPanel还是只访问鼠标坐标?如果只需要后者,让Something直接处理xy,或者引入一个中间对象(如果你能写一个接口,那就更好了),并将SomethingMainPanel:解耦

class MainPanel extends JPanel implements MouseMotionListener {
public int mouseX, mouseY;
// everything else
public Point getMousePosition() {
return new Point(this.mouseX, this.mouseY);
} 
}

并且在Something:中

public void myMethod(Point mousePosition) {
System.out.printf("Mouse position: %d x %dn", mousePosition.getX(),
mousePosition.getY());
}

为什么它更好?Something不知道MainPanel,它只知道Point。你可以用你想要的任何东西创建Points,并将其发送到Something:

用法示例:

MainPanel mainPanel = MainPanel();
MyOtherComponent myOtherComponent = MyOtherComponent(); 
Something something = new Something();
something.myMethod(mainPanel.getMousePosition());
something.myMethod(myOtherComponent.myMousePositionMethod());
// or even
something.myMethod(new Point(1,1));

最新更新