1. Урок 1.00:03:06
    0.1. Why I wrote this book (and course)
  2. Урок 2.00:02:13
    0.2. Hearty welcome
  3. Урок 3.00:01:24
    0.3. Course author
  4. Урок 4.00:01:31
    0.4. Comfort and Learning
  5. Урок 5.00:01:26
    0.5. How to ask questions
  6. Урок 6.00:01:58
    0.6. Exercises
  7. Урок 7.00:02:13
    0.7. Exercises in IntelliJ 2020.1 (or later)
  8. Урок 8.00:02:14
    0.8. History of dynamic proxies
  9. Урок 9.00:03:11
    0.9. Big Win
  10. Урок 10.00:01:02
    0.10. Infrastructure Code
  11. Урок 11.00:03:23
    0.11. Risk of dynamic proxies
  12. Урок 12.00:01:00
    0.12. What will we learn?
  13. Урок 13.00:01:18
    0.13. Java version
  14. Урок 14.00:02:26
    0.14. Shallow vs deep reflection
  15. Урок 15.00:01:11
    0.15. Book sample code
  16. Урок 16.00:02:29
    0.16. How code is modularized
  17. Урок 17.00:00:22
    0.17. Enjoy!
  18. Урок 18.00:02:14
    0.18. Exercise 0.1
  19. Урок 19.00:00:37
    1.0. Design Patterns Cousins
  20. Урок 20.00:02:43
    1.0.1. Christopher Alexander and Design Patterns
  21. Урок 21.00:03:11
    1.0.2. What's in a name?
  22. Урок 22.00:01:15
    1.0.3. Four Cousins
  23. Урок 23.00:01:33
    1.1.1. Proxy Intent
  24. Урок 24.00:01:21
    1.1.2. Proxy Structure
  25. Урок 25.00:01:32
    1.1.3. Proxy Variations
  26. Урок 26.00:01:05
    1.1.4. Proxy Exercises
  27. Урок 27.00:01:25
    1.2.1. Adapter Intent
  28. Урок 28.00:02:26
    1.2.2. Adapter Structure
  29. Урок 29.00:01:32
    1.2.3. Object Adapter vs Proxy
  30. Урок 30.00:00:24
    1.2.4. Adapter Exercises
  31. Урок 31.00:03:19
    1.3.1. Decorator Intent
  32. Урок 32.00:01:19
    1.3.2. Decorator Structure
  33. Урок 33.00:02:28
    1.3.3. Decorator OutputStream
  34. Урок 34.00:01:01
    1.3.4. OutputStream Objects
  35. Урок 35.00:03:25
    1.3.5. OutputStream Code Samples
  36. Урок 36.00:01:14
    1.3.6. Decorator vs Proxy
  37. Урок 37.00:00:33
    1.3.7. Decorator Exercises
  38. Урок 38.00:00:51
    1.4.1. Composite Intent
  39. Урок 39.00:01:00
    1.4.2. Composite Structure
  40. Урок 40.00:00:26
    1.4.3. Composite vs Proxy
  41. Урок 41.00:00:25
    1.4.4. Merging and reducing return values
  42. Урок 42.00:00:17
    1.4.5. (Ab)using dynamic proxies to implement all four cousins
  43. Урок 43.00:00:31
    1.4.6. Composite Exercises
  44. Урок 44.00:00:59
    1.5.1. Chain of Responsibility Intent
  45. Урок 45.00:02:32
    1.5.2. Chain of Responsibility Sample Code
  46. Урок 46.00:00:29
    1.5.3. Chain of Responsibility Summary
  47. Урок 47.00:00:20
    1.5.4. Chain of Responsibility Pitfalls
  48. Урок 48.00:00:18
    1.5.5. Chain of Responsibility Exercises
  49. Урок 49.00:01:48
    2. Handcrafted proxies
  50. Урок 50.00:01:05
    2.1.1. Virtual Proxy
  51. Урок 51.00:00:35
    2.1.2. CustomMap Interface
  52. Урок 52.00:01:47
    2.1.3. CustomHashMap Class
  53. Урок 53.00:01:59
    2.1.4. VirtualCustomMap Class
  54. Урок 54.00:01:41
    2.1.5. CustomMap Class Diagram
  55. Урок 55.00:01:48
    2.1.6. Using VirtualCustomMap
  56. Урок 56.00:01:25
    2.1.7. Sizeof in Java
  57. Урок 57.00:02:07
    2.2. Remote Proxy
  58. Урок 58.00:00:42
    2.2.1. RealCanada
  59. Урок 59.00:01:17
    2.2.2. Spark Framework
  60. Урок 60.00:00:49
    2.2.3. Service Publisher with Spark
  61. Урок 61.00:00:49
    2.2.4. Service Publisher with Jetty
  62. Урок 62.00:02:04
    2.2.5. Remote Proxy CanadianEmbassy
  63. Урок 63.00:00:45
    2.2.6. Canada Class Diagram
  64. Урок 64.00:00:29
    2.2.7. Heinz Applying for Canadian Visa
  65. Урок 65.00:01:25
    2.3. Protection proxy
  66. Урок 66.00:02:34
    2.3.1. ConcurrentTest for testing thread safety in CustomMap
  67. Урок 67.00:05:13
    2.3.2. Code walk-through and demo for ConcurrentTest
  68. Урок 68.00:00:17
    2.3.3. Protection Proxy to the rescue
  69. Урок 69.00:00:30
    2.3.4. SynchronizedCustomMap
  70. Урок 70.00:01:50
    2.3.5. Synchronized or ReentrantLock?
  71. Урок 71.00:00:48
    2.3.6. SynchronizerTestDemo
  72. Урок 72.00:01:06
    2.3.7. Unmodifiable Map
  73. Урок 73.00:01:26
    2.3.8. UnmodifiableCustomMap
  74. Урок 74.00:02:04
    2.3.9. UnsupportedOperationException
  75. Урок 75.00:00:41
    2.4. Cascaded Proxies
  76. Урок 76.00:00:28
    2.4.1. More flexible proxy structure
  77. Урок 77.00:01:15
    2.4.2. Cascading proxies code
  78. Урок 78.00:01:19
    2.5. equals() in proxies
  79. Урок 79.00:01:47
    2.5.1. IDE-generated equals() in CustomHashMap
  80. Урок 80.00:01:10
    2.5.2. How AbstractMap implements equals()
  81. Урок 81.00:01:59
    2.5.3. New CustomHashMap.equals() method (Broken contract)
  82. Урок 82.00:00:25
    2.5.4. Proxy's equals() delegates call
  83. Урок 83.00:02:53
    2.5.5. Correct CustomHashMap.equals()
  84. Урок 84.00:03:24
    2.6.1. Exercise 2.1. Problem Statement
  85. Урок 85.00:07:44
    2.6.2. Exercise 2.1. Walkthrough
  86. Урок 86.00:16:14
    2.6.3. Exercise 2.2. Problem Statement
  87. Урок 87.00:24:04
    2.6.4. Exercise 2.2. Walkthrough
  88. Урок 88.00:00:48
    2.7. Summary
  89. Урок 89.00:00:47
    3. Dynamic Proxies
  90. Урок 90.00:03:54
    3.0.1. Avoid Copy and Paste
  91. Урок 91.00:03:56
    3.1. Proxy.newProxyInstance()
  92. Урок 92.00:00:46
    3.1.1. IllegalArgumentException from Wrong ClassLoader
  93. Урок 93.00:01:14
    3.1.2. Correct ClassLoader Specified
  94. Урок 94.00:04:27
    3.1.3. Java Platform Module System
  95. Урок 95.00:01:39
    3.1.4. InvocationHandler
  96. Урок 96.00:01:14
    3.2. LoggingInvocationHandler
  97. Урок 97.00:03:52
    3.2.1. invoke() Method for LoggingInvocationHandler
  98. Урок 98.00:00:50
    3.2.2. toString() Prints Methods with Args
  99. Урок 99.00:01:22
    3.2.3. Demo of LoggingInvocationHandler
  100. Урок 100.00:00:29
    3.3. Dissecting a Dynamic Proxy
  101. Урок 101.00:01:04
    3.3.1. Dynamic Proxy Class Name
  102. Урок 102.00:00:49
    3.3.2. Decompiling $Proxy0
  103. Урок 103.00:06:42
    3.3.3. $Proxy0 Code Walkthrough
  104. Урок 104.00:01:30
    3.3.4. How Does $Proxy0 Work?
  105. Урок 105.00:04:46
    3.3.5. EscapeAnalysisTest of Arguments Array
  106. Урок 106.00:01:42
    3.3.6. Turbo-boosting Reflection Methods
  107. Урок 107.00:06:28
    3.3.6.1. TurboBoosterTest Demo
  108. Урок 108.00:02:03
    3.3.6.2. MethodTurboBooster Code Review
  109. Урок 109.00:00:16
    3.4. Recasted Exceptions
  110. Урок 110.00:00:31
    3.4.1. Unexpected Exceptions Causing Issues
  111. Урок 111.00:01:32
    3.4.2. RecastingExceptionsBroken
  112. Урок 112.00:01:31
    3.4.3. Unwrapping InvocationHandler
  113. Урок 113.00:00:27
    3.4.4. RecastingExceptionsFixed
  114. Урок 114.00:01:02
    3.5. Proxies Facade
  115. Урок 115.00:01:17
    3.5.1. Proxies.castProxy()
  116. Урок 116.00:00:54
    3.5.2. simpleProxy()
  117. Урок 117.00:00:51
    3.5.3. RealISODateParser
  118. Урок 118.00:01:18
    3.5.4. Using Proxies Facade
  119. Урок 119.00:01:05
    3.6. Virtual Dynamic Proxy
  120. Урок 120.00:00:27
    3.6.1. Proxies Facade virtualProxy()
  121. Урок 121.00:01:09
    3.6.2. Creating Virtual Proxy
  122. Урок 122.00:01:25
    3.6.3. Company and MoralFibre
  123. Урок 123.00:01:00
    3.6.4. CompanyTest
  124. Урок 124.00:01:03
    3.7. Synchronized Dynamic Proxy
  125. Урок 125.00:00:18
    3.7.1. Proxies Facade synchronizedProxy()
  126. Урок 126.00:00:52
    3.7.2. SynchronizedTest
  127. Урок 127.00:01:13
    3.8. Cascading Dynamic Proxies
  128. Урок 128.00:01:58
    3.9. EnhancedStream
  129. Урок 129.00:01:43
    3.9.1. EnhancedStream Code Review
  130. Урок 130.00:00:29
    3.10. Dynamic Proxy Restrictions
  131. Урок 131.00:00:37
    3.10.1. Interfaces Only
  132. Урок 132.00:00:33
    3.10.2. UndeclaredThrowableException
  133. Урок 133.00:00:59
    3.10.3. Return Types Have to be Correct
  134. Урок 134.00:01:33
    3.10.4. Naming Mysteries
  135. Урок 135.00:00:40
    3.10.5. Deeper Call Stacks
  136. Урок 136.00:01:48
    3.10.6. Shared Proxy Classes
  137. Урок 137.00:03:01
    3.11. Performance
  138. Урок 138.00:04:06
    3.11.1. Model for Benchmark using JMH
  139. Урок 139.00:01:38
    3.11.2. Benchmark increment() Results
  140. Урок 140.00:00:51
    3.11.3. Benchmark consumeCPU() Results
  141. Урок 141.00:00:41
    3.11.4. Summary of Benchmark Results
  142. Урок 142.00:00:16
    3.12. Exercises
  143. Урок 143.00:00:25
    3.12.1. Exercises 3.1. Problem Statement
  144. Урок 144.00:01:31
    3.12.2. Exercises 3.1. Walkthrough
  145. Урок 145.00:02:14
    3.12.3. Exercises 3.2. Problem Statement
  146. Урок 146.00:08:32
    3.12.4. Exercises 3.2. Walkthrough
  147. Урок 147.00:00:37
    4. Dynamic Decorator
  148. Урок 148.00:00:37
    4.0. Decorator Structure
  149. Урок 149.00:02:54
    4.1. Filtering for Immutability
  150. Урок 150.00:01:15
    4.1.1. ImmutableCollection
  151. Урок 151.00:01:05
    4.1.2. HandcodedFilter
  152. Урок 152.00:00:23
    4.1.3. MutableCollection
  153. Урок 153.00:01:05
    4.1.4. UML Diagram
  154. Урок 154.00:01:45
    4.1.5. HandcodedFilter Demo
  155. Урок 155.00:04:53
    4.2. FilterHandler
  156. Урок 156.00:04:55
    4.2.1. FilterHandler Class
  157. Урок 157.00:01:44
    4.2.2. Proxies Facade Gets filter() Method
  158. Урок 158.00:01:08
    4.2.3. Dynamic Filter Demo
  159. Урок 159.00:02:25
    4.2.4. What Happened?
  160. Урок 160.00:00:45
    4.3. VTable
  161. Урок 161.00:02:06
    4.3.1. VTable Overview
  162. Урок 162.00:04:49
    4.3.2. ParameterTypesFetcher
  163. Урок 163.00:04:53
    4.3.3. MethodKey
  164. Урок 164.00:03:58
    4.3.4. VTable
  165. Урок 165.00:07:39
    4.3.4.1. VTable put() and findIndex()
  166. Урок 166.00:03:31
    4.3.4.2. VTable.getDefaultMethodHandle()
  167. Урок 167.00:00:58
    4.3.4.3. Turbo-Boosting Methods in VTable
  168. Урок 168.00:03:41
    4.3.4.4. VTable.lookup() and stream()
  169. Урок 169.00:19:04
    4.3.5. VTable.Builder
  170. Урок 170.00:01:40
    4.3.6. VTables Facade
  171. Урок 171.00:00:23
    4.3.7. VTable Summary
  172. Урок 172.00:05:42
    4.4. ChainedInvocationHandler
  173. Урок 173.00:00:45
    4.4.1. UnhandledMethodException
  174. Урок 174.00:01:49
    4.4.2. VTableHandler
  175. Урок 175.00:01:32
    4.4.3. VTableDefaultMethodHandler
  176. Урок 176.00:05:35
    4.4.4. UnifiedInvocationHandler
  177. Урок 177.00:00:49
    4.5.1. Exercise 4.1. Problem Statement
  178. Урок 178.00:02:12
    4.5.2. Exercise 4.1. Walkthrough
  179. Урок 179.00:03:33
    4.5.3. Exercise 4.2. Problem Statement
  180. Урок 180.00:13:31
    4.5.4. Exercise 4.2. Walkthrough
  181. Урок 181.00:00:31
    5. Dynamic Object Adapter
  182. Урок 182.00:01:00
    5.0.1. Singer and Rapper
  183. Урок 183.00:01:13
    5.0.2. Class Adapter
  184. Урок 184.00:01:22
    5.0.3. Object Adapter
  185. Урок 185.00:00:13
    5.1. Better Collections
  186. Урок 186.00:02:32
    5.1.1.1. Generics Type Erasure
  187. Урок 187.00:02:18
    5.1.1.2. Demo of ArrayList
  188. Урок 188.00:02:45
    5.1.1.3. Covariant Return Types
  189. Урок 189.00:01:34
    5.1.2.1. BetterArrayList
  190. Урок 190.00:01:01
    5.1.2.2. Demo of BetterArrayList
  191. Урок 191.00:01:25
    5.1.3.1. BetterCollection Interface
  192. Урок 192.00:00:35
    5.1.3.2. BetterConcurrentSkipListSet
  193. Урок 193.00:01:17
    5.1.4.1. Object Adapter Pattern
  194. Урок 194.00:01:24
    5.1.4.2. BetterCollectionObjectAdapter
  195. Урок 195.00:00:25
    5.1.4.3. Demo of BetterCollectionObjectAdapter
  196. Урок 196.00:00:52
    5.1.4.4. What if we want to make a better Set, List, etc.?
  197. Урок 197.00:01:54
    5.1.5.1. ObjectAdapterHandler
  198. Урок 198.00:01:44
    5.1.5.2. Proxies.adapt()
  199. Урок 199.00:02:23
    5.1.5.3. BetterCollectionFactory
  200. Урок 200.00:01:16
    5.1.5.4. Demo of Dynamic Object Adapter
  201. Урок 201.00:01:10
    5.2.1. Dynamic Object Adapter Restrictions
  202. Урок 202.00:03:46
    5.2.2. AdapterPuzzle1
  203. Урок 203.00:01:08
    5.2.3. AdapterPuzzle2
  204. Урок 204.00:00:29
    5.3. Performance
  205. Урок 205.00:01:38
    5.3.1. Benchmark
  206. Урок 206.00:02:30
    5.3.2. JMH Benchmark Code
  207. Урок 207.00:01:10
    5.3.3. Benchmark size() Results
  208. Урок 208.00:01:00
    5.3.4. Benchmark toArray() Results
  209. Урок 209.00:01:49
    5.3.5. Benchmark forEachFiltered() Results
  210. Урок 210.00:01:52
    5.4.1. Exercise 5.1. Problem Statement
  211. Урок 211.00:05:22
    5.4.2. Exercise 5.1. Walkthrough
  212. Урок 212.00:01:17
    5.4.3. Exercise 5.2. Problem Statement
  213. Урок 213.00:05:48
    5.4.4. Exercise 5.2. Walkthrough
  214. Урок 214.00:01:25
    5.4.5. Exercise 5.3. Problem Statement
  215. Урок 215.00:11:08
    5.4.6. Exercise 5.3. Walkthrough
  216. Урок 216.00:03:22
    6. Dynamic Composite
  217. Урок 217.00:01:13
    6.0.1. Composite Structure
  218. Урок 218.00:01:07
    6.0.2. Visitor Pattern
  219. Урок 219.00:05:33
    6.0.3. add() and remove() in Component?
  220. Урок 220.00:03:02
    6.1. Mailing List
  221. Урок 221.00:00:56
    6.1.1. Contact and Person
  222. Урок 222.00:01:37
    6.1.2. DistributionList
  223. Урок 223.00:01:19
    6.1.3. Contact Class Diagram
  224. Урок 224.00:01:13
    6.1.4. Let's Build a Mailing List
  225. Урок 225.00:00:29
    6.1.5. Mailing List Object Graph
  226. Урок 226.00:00:35
    6.1.6. Composite Classes Look Similar
  227. Урок 227.00:00:52
    6.1.7. BaseComponent
  228. Урок 228.00:00:25
    6.1.8. Contact extends BaseComponent
  229. Урок 229.00:00:49
    6.1.9. BaseComponent Class Diagram
  230. Урок 230.00:00:54
    6.2. CompositeHandler
  231. Урок 231.00:01:48
    6.2.1. CompositeHandler Constructor
  232. Урок 232.00:01:22
    6.2.2. Matching add() and remove() methods
  233. Урок 233.00:01:43
    6.2.3. requiresAllInterfaces()
  234. Урок 234.00:07:03
    6.2.4. addChildMethods()
  235. Урок 235.00:01:09
    6.2.5. UncheckedException
  236. Урок 236.00:02:10
    6.2.6. mapFunction()
  237. Урок 237.00:03:01
    6.2.7. map and reduce
  238. Урок 238.00:00:45
    6.2.8. Reducer.PROXY_INSTANCE_REDUCER
  239. Урок 239.00:00:29
    6.2.9. Merging final result and unwrapping UncheckedException
  240. Урок 240.00:00:14
    6.2.10. CompositeHandler summary
  241. Урок 241.00:01:11
    6.2.11. Proxies.compose()
  242. Урок 242.00:00:57
    6.2.12. Dynamic Composite Contact
  243. Урок 243.00:01:16
    6.3. TeeAppendables
  244. Урок 244.00:00:53
    6.3.1. Demo of TeeOutputStream
  245. Урок 245.00:00:27
    6.3.2. OutputStreamComposite
  246. Урок 246.00:02:25
    6.3.3. Interfaces of OutputStream and Writer
  247. Урок 247.00:01:40
    6.3.4. TeeAppendable Handwritten Composite
  248. Урок 248.00:01:02
    6.3.5. Making TeeAppendable into Writer
  249. Урок 249.00:02:28
    6.3.6. Demo of TeeAppendable
  250. Урок 250.00:01:45
    6.4. AppendableFlushableCloseable
  251. Урок 251.00:00:59
    6.4.1. Composing Appendable Dynamically
  252. Урок 252.00:02:19
    6.5.1. Exercise 6.1. Problem Statement
  253. Урок 253.00:09:45
    6.5.2. Exercise 6.1. Walkthrough
  254. Урок 254.00:00:43
    6.5.3. Exercise 6.2. Problem Statement
  255. Урок 255.00:03:23
    6.5.4. Exercise 6.2. Walkthrough
  256. Урок 256.00:04:57
    7. Conclusion