Java 太多的内部类?

Java 太多的内部类?,java,inner-classes,Java,Inner Classes,我了解到,当一个对象与另一个对象紧密关联时,将使用内部类。因此LinkedList类可能包含一个内部节点类,因为每个节点只存在于其LinkedList中 我正在考虑制作一个游戏,并且正在考虑制作一个地图对象,它有一个双瓦片数组,其中每个瓦片都是一个内部类 但后来我认为,实际上,Map类应该是Game类中的一个内部类 因此,我们有 class Game { class Map { Tile[][] grid; class Tile { ... } ...

我了解到,当一个对象与另一个对象紧密关联时,将使用内部类。因此LinkedList类可能包含一个内部节点类,因为每个节点只存在于其LinkedList中

我正在考虑制作一个游戏,并且正在考虑制作一个地图对象,它有一个双瓦片数组,其中每个瓦片都是一个内部类

但后来我认为,实际上,Map类应该是Game类中的一个内部类

因此,我们有

class Game {
  class Map {
    Tile[][] grid;
    class Tile {
      ...
    }
  ...
  }
  class Unit {
    ...
  }
  class Player {
    ...
  }
  ...
}
然而,这似乎有些过分,因为它只会产生一个巨大的文件。这是个问题吗?还是我完全误解了内部阶级的观点


<> P>当你选择新的课堂时,你应该考虑的因素是什么,如果选择是内在的,那么什么时候内部类应该是代码>静态< /代码>?

何时使用内部类和科学一样多的艺术。基本上看一下你的代码文件有多大,每个类有多大。如果一个类很大而且很复杂,那么它应该放在自己的文件中。如果它很小(例如侦听器接口的单个函数实现),并且不太可能在其他地方重复使用,那么它应该是一个内部类

事实上,重复使用可能是最重要的标准之一。任何可以重复使用的东西都应该重复使用,并且应该适当地确定范围以实现这一点


内部类的一个重要优点是,它们可以帮助封装,使类的内部实现保持在内部。如果其他类不需要知道您的内部类(或者在某些情况下甚至不需要知道它们的存在),那么这就是它们是内部类的一个很好的理由。

在我看来,内部类是无用的,会导致糟糕的设计,使用不应该授予的访问权限,使代码不清楚。 忘了吧


(当然,依我个人的观点)

这不是一个“太多”的问题,至少在你达到某个硬限制之前是这样。这是一个什么可以合理地说是属于什么的问题。映射总是有条目,可以是内部类。游戏并不总是有地图,所以地图不应该在游戏的内部。

在您试图实现的游戏示例中,y。Map和tiles可以是适当的数据结构,而不是单独的内部类。将它们作为类有什么具体要求吗?

我想问的问题是“内部类本身作为一个概念是否有意义?”类型为
Map
的对象是否有意义,或者
Game.Map
是否增加了重要的价值


我将
Map
本身是有意义的,因此应该是一个外部类。然后,您可以使用名称空间指定游戏和地图的密切关系。

最好将您的程序视为一系列外部类,偶尔内部类是一个罕见的例外。在我的整个职业生涯中,我从来没有写过一个内部类。我和@RobertHarvey在一起,也有同样的经历。关于这一点,会有很多意见,但我通常将我的内部类保留为仅在包含类的上下文中使用的对象。如果我在其他地方需要它,从其他语境来看,它就成了它自己的类别;请看。这个问题是主观的,但我觉得它符合“建设性”标准。投票重新打开。我会将其限定为“如果它很小,并且除了在编写它的类中之外,不太可能在其他任何地方使用。”在许多情况下,您希望代码具有对包含对象、方法和字段的隐式访问权。这不仅仅证明知道如何以及何时使用内部类是合理的,这绝对不是事实。如果使用得当,内部类可以是非常好的设计。事实上,它们在标准JDK类中使用过很多次。事实上,尽管粗略地说,你所说的有相当多的真实性。首先,内部类的实现很粗糙(没有真正的JVM支持,例如),因此有很大的限制和奇怪之处。我不确定地图本身是否有意义,因为地图的行为在很大程度上取决于它来自哪个游戏。Chess.Board与Longority.Board非常不同,但您可以为游戏编写地图编辑程序,在这种情况下,您需要将地图类与游戏类分开。通常,国际象棋和垄断的棋盘类的区别不仅仅在于它们可能是国际象棋和垄断的内部类,还在于它们位于com.example.game.Chess和com.example.game.垄断者的包中。@Ypnypn国际象棋和垄断作为一个类都没有意义。它们将是一个包含多个类的名称空间,例如Chess.Game和Chess.Board。