Java:为什么不声明传递引用的静态intead?
假设我们想制作一个你必须收集宝石的游戏.所以我们需要一个Gem类,一个GemSpawner类,当然还有MainActivity类.
public class MainActivity { public static void main(String[] args) { List<Gem> gems = new ArrayList<Gem>(); GemSpawner gs = new GemSpawner(gems); //... } } 在这种情况下,我们使用gems创建了一个List,并通过它的构造函数将其传递给GemSpawner,因此gs可以使用以下命令将gems添加到列表中: gems.add(new Gem(10,50,"red")); //should represent Xpos,Ypos,and color. 但这不会更好: public class MainActivity { public static List<Gem> gems = new ArrayList<Gem>(); public static void main(String[] args) { GemSpawner gs = new GemSpawner(); //... } } 现在,GemSpawner(gs)可以使用以下命令添加宝石: MainActivity.gems.add(new Gem(10,"red")); 朋友只向我展示并解释了上述方法,但下面的方法不是更有效吗? 解决方法
这是一个比你可能意识到的更复杂的问题.
许多开始使用Java编写的人开始将我的所有内容完全静态化,因为你不必传递引用 – 它使你的代码“更简单”. 但是,当您的代码变得更复杂时,您就开始遇到问题.这些问题出现了3条主线: >封装 Encapsulation 这是一个对象不应该允许直接访问其成员的想法,它应该被告知“做事”,然后它会在内部完成,而不会暴露这是如何完成的. 这背后的想法是你试图避免过于紧密地将你的类相互耦合. 这引导我们进入下一点 Abstraction 在Java中,这通过抽象类和接口表示. 这个想法是你的GemSpawner只是产生宝石的定义.内部如何做到这一点真的不是一个人的事,而是它自己的事. 在Java中,您无法真正地将静态方法与关键的OO继承理念进行协调. 静态方法是继承的,但它们被遮蔽而不是被覆盖,因此您不能(轻松地)修改它们的行为. 这导致我们进入 测试 随着程序变得越来越复杂,这个主题越来越多. 你如何测试“Hello World”程序?好吧,你运行它,看它是否打印“Hello Wrld” – 在这种情况下有一个错误. 一旦程序变得更复杂,你就不能简单地做到这一点.你需要分开你的程序并测试“单位”.被称为Unit Testing. 在这里你的静态引用真的开始引起问题.您无法将程序分离为离散单元,因为所有内容都通过直接类引用绑定在一起.而且你不能模拟静态方法的行为,因为它们不容易被覆盖. 所以,总结一下.是;它可能更快更容易在任何地方放置静态而不是传递引用.但是,如果你计划编写像游戏一样复杂的东西,你应该考虑使用Java来充分发挥它的潜力. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |