java - Java中无状态对象的实例化

标签 java static

在 Java 中有什么方法可以避免实例化无状态对象?静态函数和无状态对象之间没有真正的区别,例如:

class CompareInts {
  Integer compare(Integer a, Integer b) {
    return a.compareTo(b);
  }

static Integer compare(Integer a, Integer b) {
  return a.compareTo(b);
}

在功能方面,这两个替代方案做同样的事情,通常每个无状态类都可以转换为静态函数。但有两个主要区别:

  1. 实例化静态类既需要时间又需要内存,而这两者都不需要。您只真正需要存储不需要在堆上分配对象和指向 vtable 的指针的代码。
  2. 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/

相关文章:

dll - 使用没有 dll 的 libcurl

java - 如何确定字符串中包含的数据类型?

java - 如何将java代码添加到静态网页中?

Java游戏重置时不保存变量

multithreading - java中对静态方法的并发访问,是否需要同步?

static - 静态特征函数的 Rust 类型提示

c++ - 无法在静态类函数中递增静态变量

javascript - 在类和构造函数中访问 ES6/ES7 静态类变量

java - Google Play 服务入门,无法解析符号

java - 根据源List内容将List转换为List<List>