Effective Java

max Π°Π²Π°Ρ‚Π°Ρ€

  Π›ΡƒΡ‡ΡˆΠ°Ρ рСализация синглтона - enum с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом!

28
Находится Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…:

Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½ - это просто класс, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создаСтся лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Они ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ систСмный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ. НапримСр, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΎΠΊΠΎΠ½ ΠΈΠ»ΠΈ файловая систСма. 

Π”ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° java 1.5, сущСствовало Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ синглтонов. Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°Π»ΠΈΡΡŒ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ конструкторС ΠΈ объявлСнии ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для обСспСчСния доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ синглтона. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» final ΠΏΠΎΠ»Π΅ΠΌ класса:

Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ  ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ поля Elvis.INSTANCE. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ конструкторов Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ лишь ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚: Класс Elvis создаСтся Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ - Π½Π΅ большС ΠΈ Π½Π΅ мСньшС. Π₯отя, Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ большой нСдостаток Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° - ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ привилСгиями  ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор с использованиСм рСфлСксии с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° AccessibleObject.setAccessible. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠ³Ρ€ΠΎΠ·Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ конструктор Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ выбрасывал ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр. 

   Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ синглтонов, ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½ΠΎΠΌ являСтся статичСский Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

max Π°Π²Π°Ρ‚Π°Ρ€

  Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ шаблон 'Builder' Π² случаС наличия большого количСства Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² конструктора

23
Находится Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…:

      БтатичСскиС Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΈ конструкторы ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: ΠΎΠ½ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ большом количСствС ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Рассмотрим случай класса, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ состав ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° любом ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅. Допустим, Π½Π°  ΡΡ‚ΠΈΠΊΠ΅Ρ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ (Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ), количСство ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅, ΠΊΠ°Π»ΠΎΡ€ΠΈΠΈ Π² 1 ΡˆΡ‚. ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²: ΠΆΠΈΡ€Π½ΠΎΡΡ‚ΡŒ, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ соды ΠΈ Ρ‚.Π΄. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния для Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ. ΠšΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ конструкторов ΠΈΠ»ΠΈ статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π’Ρ‹ Π±Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса? Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ, программисты ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ шаблон "ВСлСскопичСского конструктора". Π‘ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ :Π² ΠΎΠ΄Π½ΠΎΠΌ конструкторС  Π²Ρ‹ описываСтС Π² ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ - Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ + 1 Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ; Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ - Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ + 2 Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Ρ‚.Π΄. Π’ ΠΈΡ‚ΠΎΠ³Π΅, класс прСвращаСтся Π² конструкторного монстра. 

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это выглядит Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅:

max Π°Π²Π°Ρ‚Π°Ρ€

  Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ статичСскиС Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ вмСсто конструкторов

21
Находится Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…:

    Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ способом создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса являСтся использованиС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… (public) конструкторов. Однако, сущСствуСт ΠΈ другая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ статичСский Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (static factory method), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса.

    Π’ качСствС простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ класс Boolean (Π²Ρ€Π°ΠΏΠΏΠ΅Ρ€ Π½Π°Π΄ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠΌ boolean). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ транслируСт boolean Π² ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Boolean:

БтатичСскиС Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ свои прСимущСства ΠΈ нСдостатки.

 

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° статичСских Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

 

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ прСимущСством являСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΈΠΌΠ΅Π½ Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструктора Π½Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚, Ρ‚ΠΎ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ с Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»Π΅Π½. Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ конструктор

с Π΄Π°Π½Π½ΠΎΠΉ сигнатурой. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ часто обходят это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ объявлСния Π΄Π²ΡƒΡ… конструкторов с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ порядком. Но это, Π½Π° самом Π΄Π΅Π»Π΅, ΠΎΡ‡Π΅Π½ΡŒ

ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ API Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ ΠΊΠ°ΠΊΠΎΠΉ конструктор слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΉ ситуации, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСподходящий конструктор ΠΏΠΎ ошибкС. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅

с Ρ‚Π°ΠΊΠΈΠΌ классом придСтся часто ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (Ссли ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΎΠ½Π° сущСствуСт).