如何同时初始化所有类

时间:2014-11-30 07:36:22

标签: java nullpointerexception bukkit

在我的Bukkit Java插件中,这是我第一次将代码分离到服务提供商,因此我可以在调试时轻松禁用其中的一部分。

由于某种原因导致出现意外问题,我从已初始化的服务中获得了 NullPointerExceptions ,但它们包含了尚未提供的其他服务的代码。

例如:

worldServiceProvider = new WorldServiceProvider();
clientServiceProvider = new ClientServiceProvider();
menuServiceProvider = new MenuServiceProvider();
statsServiceProvider = new StatsServiceProvider();
commandServiceProvider = new CommandServiceProvider();
battleServiceProvider = new BattleServiceProvider();
serverServiceProvider = new ServerServiceProvider();

该结构总是会导致错误。如何解决初始化问题,或者我应该在设计中做些什么改变?

如果你想查看源代码,这是我的github。

https://github.com/parat26/ares-network/tree/master/src/src/ares/core

2 个答案:

答案 0 :(得分:1)

解决方法是使用初始化这些变量的顺序。首先初始化那个不依赖于任何其他的,然后是第二个,依此类推。

NullPointerException意味着该对象直到现在才存在,因此,创建它将最小化此问题,在订单中创建它们。

答案 1 :(得分:0)

你可能有所谓的耦合问题。基本上,两个或更多不应该彼此了解的系统确实相互了解。你现在可以尝试做的最好的事情(希望你没有太大的代码库)是你的提供者解耦,这样他们就不会彼此了解你可以随意禁用它们。

你可以尝试的另一种方法(根据我的经验,这是非常糟糕的编程实践)不是直接访问提供者,而是使用if语句来检查它们是否为空,然后只做你的逻辑。

// instead of this:
float defaultGravity = Providers.physicsProvider.getDefaultGravity();

// do something like this:
float defaultGravity = 9.8f; // some magic default number in case provider is not found
if (Providers.physicsProdiver != null) {
    defaultGravity = Providers.physicsProvider.getDefaultGravity();
}

同样,我认为这是非常糟糕的设计,应该仅作为最后的手段使用,并且仅在代码中的少数几个地方使用。您不希望您的代码检查空值,其中值在设计之后不应该为空。

这是一本关于编程模式的免费在线书籍。这很长,但任何没有阅读它的人都可能会学到一些东西。 http://gameprogrammingpatterns.com/contents.html