在 Java 中有什么方法可以避免实例化无状态对象?静态函数和无状态对象之间没有真正的区别,例如:
class CompareInts {
Integer compare(Integer a, Integer b) {
return a.compareTo(b);
}
static Integer compare(Integer a, Integer b) {
return a.compareTo(b);
}
在功能方面,这两个替代方案做同样的事情,通常每个无状态类都可以转换为静态函数。但有两个主要区别:
- 实例化静态类既需要时间又需要内存,而这两者都不需要。您只真正需要存储不需要在堆上分配对象和指向 vtable 的指针的代码。
- Java 中的静态函数非常有限。它们不能与泛型一起使用,静态比较永远不能由必须接收比较的类使用。
因此静态函数在理论上更好,因为它提供了无状态类的所有功能,但没有运行时和内存开销。静态函数在 Java 中的功能要弱得多,因为它不能通过泛型类型调用。有什么方法可以两全其美吗?
编辑
我想写一个泛型类如下:
class Array<Type, Comparator> {
Type[] elements;
// array stuff
Type getMax() {
Type maxElement = Type.getSmallestLegalValue();
for (Type element : elements) {
maxElement = Comparator.compare(maxElement, element) > 0 ? maxElement : element;
}
return maxElement;
}
}
我不会写这个。我必须在 Array
的构造函数中接受一个 Comparator
并创建一个 CompareInts
实现的Comparator
接口(interface)。
最佳答案
您需要一个实例,就像您需要函数式语言中的函数一样,其中函数是一等公民。
但是您不需要每次都创建一个新实例,您可以将该实例存储在您的 Comparator 类的静态变量中。
关于java - Java中无状态对象的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282244/