Singleton (groovy 2.4.16 API)
Date: 2018-12-09

Package: groovy.lang

## [Java] Annotation Type Singleton

- groovy.lang.Singleton

- Class annotation to make a singleton class. The singleton is obtained through normal property access using the singleton property (defaults to "instance"). Such classes can be initialized during normal static initialization of the class or lazily (on first access). To make the singleton lazy use `@Singleton(lazy=true)`. Lazy singletons are implemented with double-checked locking and a volatile backing field. By default, no explicit constructors are allowed. To create one or more explicit constructors use `@Singleton(strict=false)`. This could be used to:

  - provide your own custom initialization logic in your own no-arg constructor - you will be responsible for the entire code (the `@Singleton` annotation becomes merely documentation)
  - provide one or more constructors with arguments for a quasi-singleton - these constructors will be used to create instances that are independent of the singleton instance returned by the singleton property
  Authors:
    Alex Tkachman
    Paul King

- - ### Element Summary

    Optional Element Summary
    Type | Name and Description
    --- | ---
    `boolean` | `lazy` @default false Returns: if this singleton should be lazy
    `String` | `property` @default "instance" Returns: the singleton property name
    `boolean` | `strict` @default true Returns: if this singleton should have strict semantics

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Object` | `wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll`

- - ### Element Detail

    - #### public boolean lazy

      @default false

      Returns:
        if this singleton should be lazy

    - #### public String property

      @default "instance"

      Returns:
        the singleton property name

    - #### public boolean strict

      @default true

      Returns:
        if this singleton should have strict semantics