有很多可能的解決方案。
實例範圍內
如果您在Something
範圍需要MainPanel
(例如,在Something
幾種方法將使用MainPanel
和MainPanel
的中間狀態是很重要的)。
將您的MainPanel
實例傳遞給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 %d\n", mainPanel.getX(),
mainPanel.getY());
}
}
初始化代碼:
MainPanel mainPanel = new MainPanel();
// ... put panel in frame, etc
Something something = new Something(mainPanel);
和/或暴露二傳手:
如果事情可以做自己的工作,即使沒有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
狀態一種方法(你不想在中參考MainPanel
0)你可以傳遞一個MainPanel
的實例作爲參數。這是獨立方法的最佳策略。即使在Something
幾種方法需要訪問MainPanel
,沒有一點存儲MainPanel
作爲一個字段,除非這些方法在某種程度上對MainPanel
的實例「一起工作」:
public void myMethod(MainPanel mainPanel) {
System.out.printf("Mouse postion: %d x %d\n", mainPanel.getX(),
mainPanel.getY());
}
用例:
MainPanel mainPanel = new MainPanel();
Something something = new Something();
something.myMethod(mainPanel);
最後,除了想到變量作用域,你應該考慮一下你的API真的需要什麼才能工作。 Something
需要訪問MainPanel
或只需鼠標的座標?如果只需要後者,有Something
直接處理x
和y
或引入中間對象(如果你可以寫一個接口就更好)和解耦Something
從MainPanel
:
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 %d\n", 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));
我想這一點。但在我的現實生活中,它需要從3或4個不同的對象獲取信息。使用構造函數傳遞信息是否是一種好的做法? –
@ GabrielA.Zorrilla,是的,沒關係。但是,如果你不喜歡帶有很多參數的構造函數,並且如果你將使用相同的對象來創建不同的其他對象,那麼你可能需要使用'builder pattern' – msangel
擊敗我。 3或4是合理的。否則使用[builder pattern](http://en.wikipedia.org/wiki/Builder_pattern)([示例](http://stackoverflow.com/questions/5007355/builder-pattern-in-effective-java))。如果'Something'可以在沒有對象的情況下完成它的工作,那麼只能使用setters。另外,要注意併發問題。 –