当前位置: 首页 > 知识库问答 >
问题:

比较器应该每次实例化还是只实例化一次?

廖臻
2023-03-14

使用自定义比较器,每次实例化比较器,而不是将其创建为常量(使用匿名类)并使用单个实例,有什么好处吗?我一直认为每次创建一个新实例没有什么好处,并且一直采用选项2(静态final字段中的单个实例)。

public class SomeClass {

  //First option:
  private static class SomeCustomComparator implements Comparator<SomeObject> {
    public int compare(SomeObject o1, SomeObject o2) {
      /*implementation*/
    }
  }

  //Second option:
  private static final Comparator<SomeObject> CUSTOM_COMPARATOR = new Comparator<SomeObject> {
    public int compare(SomeObject o1, SomeObject o2) {
      /*implementation*/
    }
  };

  public void doSomething() {
    //are there any advantages to one over the other?
    SortedSet<SomeObject> s1 = new TreeSet<>(CUSTOM_COMPARATOR);

    SortedSet<SomeObject> s2 = new TreeSet<>(new SomeCustomComparator());
  }
}

这里的假设是没有状态需要保留在比较器中。

如果do某物()被称为很多呢?如果do某物()从多个线程被调用怎么办?如果CUSTOM_COMPARATOR被拉到一个普通的班级里,公开而不是私下呢?

共有1个答案

段干长恨
2023-03-14

如果比较器没有状态(大多数都没有),那么创建一个实例并在任何地方使用它是绝对好的。不要仅仅为了它而创建额外的对象。

 类似资料:
  • 我知道我在这里有点手足无措,但我似乎不明白为什么我们不能创建两次Scanner类的实例。我将添加一个示例以防万一。 我会得到一个运行时错误,如下所示 我知道再次创建同一个类的新对象是没有意义的,鼓励冗余。但我只是觉得如果我知道为什么会让我头脑清醒,你不是也这么认为吗? 机器所说的“java.util.NosuchelementException:No line found”是什么意思,人们说扫描器

  • 问题内容: 这两种方法有什么优势吗? 范例1: 范例2: 问题答案: 没有区别-实例变量初始化实际上是由编译器放入构造函数中的。 第一种变体更具可读性。 你不能使用第一个变体进行异常处理。 另外还有初始化块,编译器也将其放在构造函数中: 但是,字段声明不是任何方法的一部分,因此它们不能像语句那样执行。相反,Java编译器会自动生成实例字段初始化代码,并将其放入该类的一个或多个构造函数中。初始化代码

  • 问题内容: 我的代码中需要一个单例。我用Java实现了它,并且效果很好。我这样做的原因是为了确保在多种环境中只有一个此类的实例。 但是现在我想用单元测试在本地测试我的Singleton对象。因此,我需要模拟此Singleton的另一个实例(该对象可能来自另一个设备)。那么是否有可能第二次实例化Singleton以进行测试,还是我必须对其进行模拟? 我不确定,但是我认为可以通过使用其他类加载器来实现

  • 以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试)。 clang实例化了函数体并在上出错。gcc和MSVC只查看函数声明,而忽略正文中的。 如果您删除Constexpr,所有编译器都会很好地编译代码。 问题: 如果声明了返回类型,是否允许decltype查看函数体? 我正在寻找标准中相应章节的参考。

  • 假设你有一个绘制了很多模型的场景,而大部分的模型包含的是同一组顶点数据,只不过进行的是不同的世界空间变换。想象一个充满草的场景:每根草都是一个包含几个三角形的小模型。你可能会需要绘制很多根草,最终在每帧中你可能会需要渲染上千或者上万根草。因为每一根草仅仅是由几个三角形构成,渲染几乎是瞬间完成的,但上千个渲染函数调用却会极大地影响性能。 如果我们需要渲染大量物体时,代码看起来会像这样: for(un

  • 7.2.2 实例化容器 实例化Spring的IoC容器很简单。提供给ApplicationContext构造方法的一个或多个路径是表示实际资源的字符串,通过路径容器能从各种外部资源(比如本地文件系统)、Java的CLASSPATH等处加载配置元数据。 ApplicationContext context = new ClassPathXmlApplicationContext("services.