Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Dit is een door AI vertaalde post.

제이온

[Effectieve Java] Item 3. Garandeer singleton met een private constructor of een enum-type

Selecteer taal

  • Nederlands
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • हिन्दी
  • Magyar

Samengevat door durumis AI

  • Een singleton is een klasse die slechts één instantie kan genereren en wordt gebruikt om stateless objecten of unieke systeemcomponenten te maken.
  • Er zijn drie manieren om een singleton te maken: een methode waarbij het public static-lid een final-veld is, een methode waarbij een statische fabriekmethode wordt aangeboden, en een methode die een enum-type gebruikt. De methode die een enum-type gebruikt, is de beste.
  • Bij het serialiseren van een singleton-klasse moet je Serializable implementeren, alle instantievelden als transient declareren en de readResolve()-methode overschrijven.

Singleton

Het concept van singleton

Een singleton is een klasse die slechts één instantie kan creëren. Een typisch voorbeeld van een singleton is een stateless object of een uniek systeemcomponent. Singleton-klassen zijn echter moeilijk te testen als ze niet zijn gedefinieerd als een type met een interface en een implementatie ervan.


Manieren om een singleton te maken

Public static member als final veld


public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public void speak() {
        System.out.println("elvis");
    }


De private constructor wordt slechts één keer aangeroepen tijdens het initialiseren van de Elvis-instantie en garandeert dat het de enige instantie in het hele systeem is. Het is echter mogelijk om de private constructor aan te roepen met AccessibleObject.setAccessible(), maar deze methode met reflectie kan worden geblokkeerd door een uitzondering te genereren wanneer een tweede object wordt aangemaakt.


  • Voordelen
    • Het is duidelijk uit de API dat deze klasse een singleton is.
    • Concis.


Publieke statische fabrieksmethode leveren

public class Elvis {

    private static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public static Elvis getInstance() {
        return INSTANCE;
    }

    public void speak() {
        System.out.println("elvis");
    }


Behalve door manipulatie via reflectie, zorgt deze methode er ook voor dat het de enige instantie in het hele systeem is. Het veld wordt simpelweg private gemaakt en het object wordt geretourneerd door middel van een statische fabrieksmethode.


  • Voordelen
    • Het is mogelijk om een singleton te veranderen zonder de API te wijzigen.
      • De statische fabrieksmethode kan bijvoorbeeld een andere instantie per thread retourneren.
    • Het is mogelijk om een generieke singleton-fabrieksmethode te maken.
    • Het is mogelijk om een methode-referentie van een statische fabrieksmethode te gebruiken als leverancier.
      • Bijvoorbeeld, in plaats van Elvis::getInstance, kan Supplier<Elvis> worden gebruikt.


Als de bovenstaande voordelen niet relevant zijn, is het beter om de eerste methode te gebruiken.


De enumeratiemethode gebruiken

public enum Elvis {

    INSTANCE;

    public void speak() {
        System.out.println("elvis");
    }


De beste methode is om een enumeratie te gebruiken. Deze methode is veiliger tegen reflectie-aanvallen dan de bovenstaande twee methoden en de code is cleaner. De twee bovenstaande methoden hebben ook het nadeel dat ze extra code moeten worden toegevoegd tijdens het serialiseren. Dit wordt later besproken.

Het is echter noodzakelijk om er rekening mee te houden dat terwijl een singleton die wordt gecreëerd, een interface kan erven, het niet mogelijk is om een klasse te erven.


Zaken om op te letten bij het serialiseren van een singleton-klasse

Als u een singleton-klasse serialiseert die is gemaakt met de eerste of tweede methode, moet u, behalve het implementeren van Serializable, alle instantievariabelen als transient declareren en de readResolve()-methode opnieuw definiëren.


private Object readResolve throws ObjectStreamException {
    return INSTANCE;


Bron

제이온
제이온
제이온
제이온
[Effectieve Java] Item 5. Gebruik afhankelijke objectinjectie in plaats van resources expliciet te noemen Wanneer een klasse afhankelijk is van externe resources, is het gebruik van singletons en statische utility-klassen af te raden. Door afhankelijke objectinjectie te gebruiken, kunt u de flexibiliteit, herbruikbaarheid en testbaarheid van de klasse verbete

28 april 2024

[Effectieve Java] Item 4. Gebruik een private constructor om instantiatie te voorkomen Voor utility-klassen die alleen statische methoden en velden bevatten, is het een goed idee om de toegangsmodifier van de constructor op 'private' te zetten om instantiatie te voorkomen. Dit voorkomt dat gebruikers de constructor verwarren met een automat

28 april 2024

[Effectieve Java] Item 6. Vermijd onnodige objectcreatie Een gids over het verminderen van onnodige objectcreatie in Java. Voor onveranderlijke objecten zoals String en Boolean is het beter om literals te gebruiken, en voor reguliere expressies is het beter om Pattern-instanties te cachen. Autoboxing kan ook le

28 april 2024

Conceptueel gegevensmodellering Conceptueel gegevensmodellering is het proces van het scheiden van entiteiten en het uitdrukken van relaties tussen entiteiten in een ERD. Entiteiten zijn onafhankelijke informatie-eenheden, en attributen zijn de gegevens die een entiteit bezit. Identific
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 april 2024

Hoe Rust concurrency-fouten voorkomt Rust is een krachtige taal die de uitdagingen van concurrency-programmeren aanpakt. Door het type-systeem en eigendomsmodel is het veilig om gegevens tussen threads te verzenden en te delen. Met behulp van interne veranderlijkheidspatronen zoals Mutex, Ch
곽경직
곽경직
곽경직
곽경직
곽경직

28 maart 2024

[Javascript] Object-structuur (V8) Het JavaScript Object wordt in de V8-engine geoptimaliseerd als een structuur afhankelijk van de toestand en werkt als een Fast-modus en een Dictionary-modus die als een hashmap werkt. De Fast-modus is snel met keys en waarden in een bijna vaste vorm, maa
곽경직
곽경직
곽경직
곽경직
곽경직

18 maart 2024

[Concurrency] Atomaire bewerking: Memory Fence en Memory Ordering Deze blogpost bespreekt hoe geheugensorde te overwegen in atomaire bewerkingen en het belang van de Ordering-opties. We bespreken verschillende Ordering-opties zoals Relaxed, Acquire, Release, AcqRel, SecCst, inclusief een beschrijving van de voor- en nad
곽경직
곽경직
곽경직
곽경직
곽경직

12 april 2024

[Undercover miljardair] Glen Starnes Een blogpost over de uitdaging om binnen 90 dagen een bedrijf van $ 1 miljoen te starten met alleen een oude vrachtwagen en $ 100. De blogpost beschrijft de drie fasen van succes: handarbeid, productverkoop en systeemopbouw. Het laat zien hoe je stap voor
junpyo jeon
junpyo jeon
junpyo jeon
junpyo jeon
junpyo jeon

26 april 2024

Prisma Client-mocken voor unit-tests in NestJS Het verwijderen van externe afhankelijkheden is belangrijk bij het testen van eenheidstoepassingen. Met de Jest-mock-methode van Prisma ORM kunt u eenvoudig eenheidstests uitvoeren. Door het installeren van het pakket jest-mock-extended en het mocken van
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 april 2024