【问题标题】:Is it advisable to have a static block inside static inner class是否建议在静态内部类中有一个静态块
【发布时间】:2019-11-27 10:26:39
【问题描述】:

我正处于一个实现之间,我计划在静态内部类中使用静态块。
此实现是作为单例类延迟初始化的一部分完成的。

如果这样做是可取的或良好的做法,我无法在 google 上找到任何信息?

欢迎提出任何建议。

public class MySingleton {

    private MySingleton() {
    }

    private static class InnerMySingleton {
        private static volatile MySingleton mysingleton;
        static {
            mysingleton = new MySingleton();
        }
    }

    public static MySingleton getInstance() {
        return MySingleton.InnerMySingleton.mysingleton;
    }
}

【问题讨论】:

  • 这是Initialization-on-demand holder idiom,你可以这样做private static final MySingleton mysingleton = new MySingleton();
  • @michalk 嗯,它是一个复杂的对象,创建它不是实际的代码,而是一个基本的原型。创建实际对象涉及很多步骤。

标签: java multithreading design-patterns singleton


【解决方案1】:

首先,你可以去:

private static volatile MySingleton mysingleton = new MySingleton();

静态块在这里没有添加任何有用的东西。如果它更复杂,那么不要使用静态块,但是

private static MySingleton makeSingleton() { ...

例如。含义:比无名块更喜欢方法(因为该方法可以有一个名称来告诉读者该方法应该做什么)。 static 只是说,好吧,“接下来发生的事情是静态的”。

第二:当有疑问时,尝试编写less代码。对于 simple 分配,静态块确实没有任何优势。请参阅here 了解一些原因。

除此之外,您可能还想学习double locking 上的 CERT,例如。有很多方法可以解决这个问题。

【讨论】:

  • 对不起,我没有在实际问题中提到 sn-p 提供的代码只是我如何在我的单例类中使用静态块的一个示例。我已经编辑了这个问题。创建对象涉及多个步骤,因此不能使用单行声明
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2011-03-18
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多