Java 访问当前对象所属的对象
这似乎是一项很容易解决的任务,但我还是找不到办法 假设我有两门课Java 访问当前对象所属的对象,java,design-patterns,refactoring,Java,Design Patterns,Refactoring,这似乎是一项很容易解决的任务,但我还是找不到办法 假设我有两门课 class Grid { private Square[][] sq; public Grid(){ // don't like this seq[0][0] = new Square(this); // etc. } public Collection<Square> getNeighbours( Square sq ){ ... } public b
class Grid {
private Square[][] sq;
public Grid(){
// don't like this
seq[0][0] = new Square(this);
// etc.
}
public Collection<Square> getNeighbours( Square sq ){ ... }
public boolean isFull(){ ... }
}
class Square {
private Grid grid;
Set<Worker> set;
public Square(Grid grid){
this.grid = grid;
set.add(new Worker(this));
}
public void dealWithNeighbours(){
for( Square s : grid.getNeighbours()) {....}
}
public boolean isGridFull(){
// now it is officially stupid
return grid.isFull();
}
}
现在的问题是,每次我需要启动一个新的Square对象时,我还必须给它的调用对象一个引用。因为广场不具备任何关于其周围环境的信息。当我需要一些关于大老板的信息时,情况就更糟了。然后我必须像在isGridFull()
的情况下一样将层链接到彼此
在实际代码中,我有三层这样的依赖关系,它已经变得非常混乱。我想知道处理这种情况的好办法。正确的设计是什么?用一般的方式回答你的问题:不,这不是个好主意。如果代码开始感到凌乱,请重新考虑您的设计 我不是100%确定你想要实现什么,但作为@Oli Charlesworth statet,
这基本上是正确的方法
重新写你的问题,也许你会得到一个更好的答案
编辑:
作为一个快速编辑,你为什么不告诉广场他们的邻居,可以让事情变得轻松一点呢?我同意@Robin的观点,你为什么不告诉广场他们的邻居呢
如果你有理由,不要告诉他们,因此我希望下一篇文章可能会对你有所帮助)
当您希望依赖性变弱时,您需要引入新的抽象级别,该级别包含有关网格
、正方形
、工作者
的所有信息。前三节课可以互相了解。据我所知,您已经有了这样的抽象级别:某个“主要顶级所有者”
因此,让所有者
了解所有情况,并让网格
正方形
和工作者
转储
public class Owner {
//structure that store grid, all related squares and all related workers
private Grid grid;
private Map<Square, Collection<Worker>> squareWorkerMap;
public Grid getGrid() {
return grid;
}
public Collection<Square> getAllSquares() {
return squareWorkerMap.values();
}
public Collection<Worker> getWorkers(Square sq) {
squareWorkerMap.get(sq);
}
public ??? getSquare(Worker worker) {
//implementation depends on if worker can belong to many squares
}
}
public class Grid {
private Owner mainTopOwner;
public Collection<Square> getSquares() {
return mainTopOwner.getAllSquares();
}
public Collection<Worker> getWorkers(Square sq) {
return mainTopOwner.getWorkers(sq);
}
}
public class Square {
private Owner mainTopOwner;
public Collection<Workers> getWorkers() {
return mainTopOwner.getWorkers(this);
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}
public class Worker {
private Owner mainTopOwner;
public Square getSquare() {
return mainTopOwner.getSquare(this)
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}
公共类所有者{
//存储网格、所有相关方块和所有相关工作人员的结构
私有电网;
私有地图;
公共网格getGrid(){
返回网格;
}
公共集合getAllSquares(){
返回squareWorkerMap.values();
}
公共收集工作人员(平方米){
squareWorkerMap.get(sq);
}
公共???getSquare(工人){
//实现取决于工人是否可以属于多个正方形
}
}
公共类网格{
私人业主维护业主;
公众收藏{
返回mainTopOwner.getAllSquares();
}
公共收集工作人员(平方米){
返回mainTopOwner.getWorkers(sq);
}
}
公共课广场{
私人业主维护业主;
公共集合getWorkers(){
返回mainTopOwner.getWorkers(此);
}
公共网格getGrid(){
返回mainTopOwner.getGrid;
}
}
公社工人{
私人业主维护业主;
公共广场{
返回mainTopOwner.getSquare(此)
}
公共网格getGrid(){
返回mainTopOwner.getGrid;
}
}
传递这是正确的处理方法。虽然一般来说,如果东西需要访问其所有者的所有者,设计可能需要重新思考。@ayan ahmedov,我的回答对你有帮助吗?如果没有,请提供更多详细信息或对其原因发表评论。我仍然可以帮助你解决这个问题。
public class Owner {
//structure that store grid, all related squares and all related workers
private Grid grid;
private Map<Square, Collection<Worker>> squareWorkerMap;
public Grid getGrid() {
return grid;
}
public Collection<Square> getAllSquares() {
return squareWorkerMap.values();
}
public Collection<Worker> getWorkers(Square sq) {
squareWorkerMap.get(sq);
}
public ??? getSquare(Worker worker) {
//implementation depends on if worker can belong to many squares
}
}
public class Grid {
private Owner mainTopOwner;
public Collection<Square> getSquares() {
return mainTopOwner.getAllSquares();
}
public Collection<Worker> getWorkers(Square sq) {
return mainTopOwner.getWorkers(sq);
}
}
public class Square {
private Owner mainTopOwner;
public Collection<Workers> getWorkers() {
return mainTopOwner.getWorkers(this);
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}
public class Worker {
private Owner mainTopOwner;
public Square getSquare() {
return mainTopOwner.getSquare(this)
}
public Grid getGrid() {
return mainTopOwner.getGrid;
}
}