【问题标题】:Functions as private member variables in javajava中作为私有成员变量的函数
【发布时间】:2025-12-19 23:20:18
【问题描述】:

我正在设计一种 Monopoly 游戏来练习我的 Java 技能。

我希望有一个“Space”类来表示游戏板上的空间。像这样。

public class Space{

    private Player [] occupants;
    private String name;

    public Space(String name){
        this.name = name;
    }

} 

我来自 python 背景,所以如果我这样做,我可能会使用某种“动作”函数初始化每个空间,每个路径都是唯一的。所以像这样。

class Space():
    def __init__(self, name):
        self.name = name
        self.action = None

GO_SPACE = Space()
def GO_ACTION():
    ## do some processing
GO_SPACE.action = GO_ACTION 

本质上是在运行时将函数分配给 Space 对象。我不记得我的语法是否正确,但希望很清楚我想要做什么。每个空间都有自己独特的功能来处理玩家登陆时的动作。

我仍然愿意改变事物的架构方向,但是我如何在 Java 中做这样的事情呢?我承认,我对 Java 的了解有点生疏,但我的第一个想法是尝试以某种方式为私有成员变量分配一个函数……这种方法是否可行?我不记得 Java 是否有对象或类似的函数。

【问题讨论】:

  • Java 8 添加了 lambda。
  • 谢谢!不知道。我会检查一下。

标签: java function object dynamic private-members


【解决方案1】:

我不明白为什么你需要它是动态的。为什么不这样:

public abstract class Space {
    // name etc.
    public abstract void action(); 
}

public class GoSpace extends Space {
    public void action() { 
       // collect 200 dollars
    }
}

等等

【讨论】:

  • 这是一个有趣的想法..所以基本上每个空间都扩展了 Space 类?我喜欢这种方法。拥有这么多子类(我想是 40 个,或者板上有很多空间)会有任何负面影响吗?如果不是,我想我会接受这个答案。
  • 我会为每个图块创建属性文件,而不是为每个图块创建一个类。
  • 没听说过.. 是 json/initialization 类型的东西吗?
  • @Zack:不,在 java 中有 很多 个类是很常见的。类是java中的一个基本单元,everything就是一个类。另请注意,我不确定您是否真的需要其中的 40 个,因为板上的 40 个空格中的大多数都没有任何特殊操作。您可以使基类非抽象,并使用它来表示那些“普通”空间。如果您想解决“每个文件一个公共类”的愚蠢 Java 规则,您也可以考虑将特殊子类设置为基类内部......或者如果有意义的话将它们设为非公共。
【解决方案2】:

即使在 Java 8 中,Java 中函数的最佳近似也是单方法接口。例如,您可以将您的action 声明为Runnable 并将其调用为action.run()

【讨论】:

  • 太好了,我也去看看。我主要是想获得一些不同的观点,以帮助我在我的 Python 思维模式之外思考。谢谢!