【问题标题】:Java static nested classes in separate files单独文件中的 Java 静态嵌套类
【发布时间】:2020-11-10 21:02:58
【问题描述】:

我正在开发自己的游戏引擎,但遇到了阻止我的墙。当我要编写游戏时,我会简单地使用我的 gameengine.jar 作为库。但我想引用一些具有神级“GameEngine”的类。

在这个例子中,我想使用一个简单地记录错误的“Logger”类。 GameEngine 和 Logger 都没有构造函数,它们是静态的。

public class GameEngine{
  public static Logger logger = Logger; // ERROR
}

class Logger{
  static void logError(){
    System.out.println("Error");
  }
}

我想做GameEngine.logger.logError();,但做不到。
我可以使用嵌套类,但两个类都很长。

【问题讨论】:

  • 我很确定 Java 没有“上帝类”的概念,但是您可以将“GameEngine”作为一个包而不是“Engine”或“Game”和“Logger”一个类?如果导入恰到好处,就可以使用你想要的语法。
  • 为什么要做GameEngine.logger.logError()?它是一个静态类,你可以只做 Logger.logError() 并且它会做同样的事情吗?或者,如果你真的想要,你可以添加一个 getter,然后它变成 GameEngine.getLogger().logError(); ?似乎你可以做你想做的事,而不是你想要的方式。此外,它们都有构造函数,只是如果您没有告诉它使用不同的构造函数,它会使用默认构造函数。如果您明确地将构造函数设为私有,则只会丢失构造函数。仅仅因为一个类是静态的并不意味着它没有构造函数

标签: java inner-classes


【解决方案1】:

解决方案 A:

public class Logger{
  public static void logError(){
    System.out.println("Error");
  }
}

然后从代码中的任何地方:

Logger.logError();

如果您想从 GameEngine 顶部调用解决方案 B:

public class GameEngine{
  public static Logger logger = new Logger();
}

(意思是 Logger 的构造函数不是私有的)

然后从代码中的任何地方:

GameEngine.logger.logError();

标准日志记录 API

您没有理由重新实现一个日志记录 API,而 Java 中已有十几个。

例如众所周知的log4j:https://logging.apache.org/log4j/2.x/manual/api.html

Java 中还有一个标准来隐藏实际的记录器实现并提供一个通用接口 (https://www.vogella.com/tutorials/Logging/article.html)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2010-09-20
    • 2010-09-09
    相关资源
    最近更新 更多