直到几个星期前,我想我知道何时制作字段和方法static
或non-static
。例如,当一个字段(比如另一个类的对象)对于该类的任意数量的对象是唯一的时,它应该是static
。
但接下来几周我就读到了JVM垃圾收集。
我知道static
字段永远不会被垃圾收集并一直保留在内存中,除非类加载器本身是垃圾收集的。
但是如果我不创建那个字段static
,至少它会被垃圾收集。
因此,在使字段/方法保持静态与否之间似乎存在 非常细线 。
任何人都可以在决定时向我解释 细线 ,以便我的应用程序更有效率。
答案 0 :(得分:8)
它可能很薄但有明显的区别。当一个字段与一个类的任何实例都没有相关时,你将它声明为静态。
静态字段的简单用法是使用final
关键字声明常量,例如:
public static final int MAX_ALLOWED = 10;
方法也是如此。当方法不依赖于类的实例或类的状态时,将方法声明为静态。这就是静态方法不能使用类的实例成员的原因。
答案 1 :(得分:3)
这些不是强制性规则,但最好遵循它们:
何时使用静态字段:
final
。SessionFactory
。请记住,静态字段在应用程序运行期间通常应该是不可变的(它们有时会在应用程序的启动和拆除期间被修改)。
何时使用静态方法:
static
以获得一点性能要好得多。 答案 2 :(得分:3)
静态字段是概念在将其用作提高应用程序效率的方法之前,您应该仔细考虑。
如您所知,当static修饰符包含在字段中时,不需要该类的实例来使用它。因此,它对整个应用程序具有相同的值。一方面,如果您没有正确地序列化访问权限,它可能会导致多线程读/写环境中出现许多错误;另一方面,如果您尝试创建singleton pattern(一个字段),那将是一件好事。具有在应用程序生命周期内不会发生变化的值,因此不需要GC )
总的来说,您应该避免读/写静态字段,它会在您的应用程序中引入更多错误。在同一类的许多实例中具有相同的值不被认为是OO设计中静态字段的良好用例。不是因为它更低或更有效,而是因为它打破了encapsulation的概念。
答案 3 :(得分:0)
不对垃圾收集进行static
字段。这是一个值得考虑的全新领域。如果static
字段的内存很大,是的,你应该non-static
。