所以我的编码朋友讨厌使用static
编码。然而,我的 Java 程序充满了类之间的链接,而且我有很多!
是否值得重写整个代码以删除静态方法?
使用其中一个有什么优势吗?
1.一个实例变量是每个对象一个,每个对象都有自己的实例变量副本。
例如:
public class Test{
int x = 5;
}
Test t1 = new Test();
Test t2 = new Test();
两者都t1
将t2
拥有自己的 x
.
2.每个 Class一个静态变量,该类的每个对象共享同一个静态变量。
例如:
public class Test{
public static int x = 5;
}
Test t1 = new Test();
Test t2 = new Test();
两者都t1
将t2
有一个 x 在它们之间共享。
3. JVM 加载类时初始化一个静态变量。
4. Astatic method
不能访问Non-static
变量或方法。
5. as well as可以模仿a Static methods
,但这不是正确的方式,因为当有很多类时,我们无法确定JVM的类加载顺序,这可能会产生问题。Static variables
Singleton Pattern
static
适用于您不想为每个实例都有副本的情况
instance
变量适用于您希望为每个对象实例单独复制的情况。
根据业务案例,使用哪一个可能会发生变化。
如果你有太多的静态函数和变量,它可能会导致更实用的方法而不是真正的 OO。此外,如果您有公共静态变量,那么您复制不好的全局变量。跟踪他们是一场噩梦。
一般来说,我的规则是如果可以使用实例变量,并且只有静态变量和函数确实是类而不是对象的泛型时才使用
这是对类似问题 Java 的一个很好的回答 :何时使用静态方法
考虑使用新操作来创建新对象并以非静态方式从该对象访问方法,而不是仅仅链接到方法。
前
public void myMethod(){
Time.setTime(Time.getTime() + 20);
System.out.println(Time.getTime());
}
后
public void myMethod(){
Time t = new Time();
t.setTime(t.getTime() + 20);
System.out.println(t.getTime());
}
这些方法中保存的任何状态现在都将成为您创建的时间实例。如果需要,您还可以在其他方法中共享变量 t。
垃圾收集 - 静态字段的寿命比实例字段长得多。从逻辑的角度来看,静态字段仅假设在每个实例之间共享 - 如果确实是您的情况,那么当然没有问题。
您是在谈论静态方法还是静态属性?
就静态方法而言,只有一种方法可以滥用它们,那就是定义将对象实例作为参数的方法。你永远不需要这样做,在我看来,这样做是糟糕的编码实践。这是一个例子:
static int add(ThisClass a, ThisClass b) {
return a.value + b.value;
}
如果您在谈论类中的静态变量,那么您基本上进入了“单例”的主题,即只有一个特定类的实例。单身人士受到很多虐待。它们被许多类库(想想 JDNI 和日志记录类)使用,但如果应用程序大量使用它们,则可能表明程序结构不佳。这可能是你朋友在抱怨的地方。
实例和静态变量:
回答您的问题:我会说值得使用静态变量来节省内存分配。
内存分配:
对于静态变量,无论是否创建对象,只分配一个内存位置,对于实例变量,每个对象分配一个内存位置
现在考虑这个例子,假设您正在处理公司内部项目,您必须为 Employee 类创建 1M 对象,并且Employee类的一些属性现在是eid、ename、ecompany重要的是所有员工都在XYZ公司工作,所以价值无论员工如何,财产公司都将是“XYZ”。
现在您知道情况了,该物业公司的价值将是XYZ代表 100 万个对象。
Now you decide you want to declare ecomapny property as static or instance considering memory allocation
if you declare it as a static then minimum memory allocated to ecompany will be only 48 bytes which very less compare to memory needed to store 1 Million instance variable. 100000 * 48 bytes = 48 Million bytes.
当您使用静态对象时(除了单例),您实际上是在实现与全局变量相结合的函数式编程。如果您经常这样做 - 您应该重新考虑您的设计或使用 Java(也许您应该使用函数式编程语言,如列表、方案等)。
专业静态
一旦从类的内部或外部调用了一个静态成员,就会调用该类的静态构造函数。“静态对象”将贯穿整个会话,因此您将在性能上获胜。
康静态
静态成员不能有状态,因此它们不能与类的非静态成员对话。
例子
如果我们考虑BigInteger 类,如果将某些部分制成静态成员,则该类会有所收获。
该类的一个实例(如预期的那样)代表一个大整数。
但是,主要方法 add 和 multiply 不是静态的(它们应该在更好的世界中),这对性能不利。
因此,在实践中,不应该害怕静态和非静态之间的混合。
我不喜欢使用静态变量或方法,因为它们没有真正的继承。这使得模拟测试变得更加困难。使用实例为您提供了完全多态的灵活性。另一方面,有时静态变量是必需的,例如使用全局缓存。如果静态方法为您无法访问或扩展的类/对象/基元提供辅助方法,则它们可能会带来好处。这些辅助方法非常简单,不需要继承。例如 java.util.Arrays 类或 java.util.Collections。