• Урок 1. 00:03:06
    0.1. Why I wrote this book (and course)
  • Урок 2. 00:02:13
    0.2. Hearty welcome
  • Урок 3. 00:01:24
    0.3. Course author
  • Урок 4. 00:01:31
    0.4. Comfort and Learning
  • Урок 5. 00:01:26
    0.5. How to ask questions
  • Урок 6. 00:01:58
    0.6. Exercises
  • Урок 7. 00:02:13
    0.7. Exercises in IntelliJ 2020.1 (or later)
  • Урок 8. 00:02:14
    0.8. History of dynamic proxies
  • Урок 9. 00:03:11
    0.9. Big Win
  • Урок 10. 00:01:02
    0.10. Infrastructure Code
  • Урок 11. 00:03:23
    0.11. Risk of dynamic proxies
  • Урок 12. 00:01:00
    0.12. What will we learn?
  • Урок 13. 00:01:18
    0.13. Java version
  • Урок 14. 00:02:26
    0.14. Shallow vs deep reflection
  • Урок 15. 00:01:11
    0.15. Book sample code
  • Урок 16. 00:02:29
    0.16. How code is modularized
  • Урок 17. 00:00:22
    0.17. Enjoy!
  • Урок 18. 00:02:14
    0.18. Exercise 0.1
  • Урок 19. 00:00:37
    1.0. Design Patterns Cousins
  • Урок 20. 00:02:43
    1.0.1. Christopher Alexander and Design Patterns
  • Урок 21. 00:03:11
    1.0.2. What's in a name?
  • Урок 22. 00:01:15
    1.0.3. Four Cousins
  • Урок 23. 00:01:33
    1.1.1. Proxy Intent
  • Урок 24. 00:01:21
    1.1.2. Proxy Structure
  • Урок 25. 00:01:32
    1.1.3. Proxy Variations
  • Урок 26. 00:01:05
    1.1.4. Proxy Exercises
  • Урок 27. 00:01:25
    1.2.1. Adapter Intent
  • Урок 28. 00:02:26
    1.2.2. Adapter Structure
  • Урок 29. 00:01:32
    1.2.3. Object Adapter vs Proxy
  • Урок 30. 00:00:24
    1.2.4. Adapter Exercises
  • Урок 31. 00:03:19
    1.3.1. Decorator Intent
  • Урок 32. 00:01:19
    1.3.2. Decorator Structure
  • Урок 33. 00:02:28
    1.3.3. Decorator OutputStream
  • Урок 34. 00:01:01
    1.3.4. OutputStream Objects
  • Урок 35. 00:03:25
    1.3.5. OutputStream Code Samples
  • Урок 36. 00:01:14
    1.3.6. Decorator vs Proxy
  • Урок 37. 00:00:33
    1.3.7. Decorator Exercises
  • Урок 38. 00:00:51
    1.4.1. Composite Intent
  • Урок 39. 00:01:00
    1.4.2. Composite Structure
  • Урок 40. 00:00:26
    1.4.3. Composite vs Proxy
  • Урок 41. 00:00:25
    1.4.4. Merging and reducing return values
  • Урок 42. 00:00:17
    1.4.5. (Ab)using dynamic proxies to implement all four cousins
  • Урок 43. 00:00:31
    1.4.6. Composite Exercises
  • Урок 44. 00:00:59
    1.5.1. Chain of Responsibility Intent
  • Урок 45. 00:02:32
    1.5.2. Chain of Responsibility Sample Code
  • Урок 46. 00:00:29
    1.5.3. Chain of Responsibility Summary
  • Урок 47. 00:00:20
    1.5.4. Chain of Responsibility Pitfalls
  • Урок 48. 00:00:18
    1.5.5. Chain of Responsibility Exercises
  • Урок 49. 00:01:48
    2. Handcrafted proxies
  • Урок 50. 00:01:05
    2.1.1. Virtual Proxy
  • Урок 51. 00:00:35
    2.1.2. CustomMap Interface
  • Урок 52. 00:01:47
    2.1.3. CustomHashMap Class
  • Урок 53. 00:01:59
    2.1.4. VirtualCustomMap Class
  • Урок 54. 00:01:41
    2.1.5. CustomMap Class Diagram
  • Урок 55. 00:01:48
    2.1.6. Using VirtualCustomMap
  • Урок 56. 00:01:25
    2.1.7. Sizeof in Java
  • Урок 57. 00:02:07
    2.2. Remote Proxy
  • Урок 58. 00:00:42
    2.2.1. RealCanada
  • Урок 59. 00:01:17
    2.2.2. Spark Framework
  • Урок 60. 00:00:49
    2.2.3. Service Publisher with Spark
  • Урок 61. 00:00:49
    2.2.4. Service Publisher with Jetty
  • Урок 62. 00:02:04
    2.2.5. Remote Proxy CanadianEmbassy
  • Урок 63. 00:00:45
    2.2.6. Canada Class Diagram
  • Урок 64. 00:00:29
    2.2.7. Heinz Applying for Canadian Visa
  • Урок 65. 00:01:25
    2.3. Protection proxy
  • Урок 66. 00:02:34
    2.3.1. ConcurrentTest for testing thread safety in CustomMap
  • Урок 67. 00:05:13
    2.3.2. Code walk-through and demo for ConcurrentTest
  • Урок 68. 00:00:17
    2.3.3. Protection Proxy to the rescue
  • Урок 69. 00:00:30
    2.3.4. SynchronizedCustomMap
  • Урок 70. 00:01:50
    2.3.5. Synchronized or ReentrantLock?
  • Урок 71. 00:00:48
    2.3.6. SynchronizerTestDemo
  • Урок 72. 00:01:06
    2.3.7. Unmodifiable Map
  • Урок 73. 00:01:26
    2.3.8. UnmodifiableCustomMap
  • Урок 74. 00:02:04
    2.3.9. UnsupportedOperationException
  • Урок 75. 00:00:41
    2.4. Cascaded Proxies
  • Урок 76. 00:00:28
    2.4.1. More flexible proxy structure
  • Урок 77. 00:01:15
    2.4.2. Cascading proxies code
  • Урок 78. 00:01:19
    2.5. equals() in proxies
  • Урок 79. 00:01:47
    2.5.1. IDE-generated equals() in CustomHashMap
  • Урок 80. 00:01:10
    2.5.2. How AbstractMap implements equals()
  • Урок 81. 00:01:59
    2.5.3. New CustomHashMap.equals() method (Broken contract)
  • Урок 82. 00:00:25
    2.5.4. Proxy's equals() delegates call
  • Урок 83. 00:02:53
    2.5.5. Correct CustomHashMap.equals()
  • Урок 84. 00:03:24
    2.6.1. Exercise 2.1. Problem Statement
  • Урок 85. 00:07:44
    2.6.2. Exercise 2.1. Walkthrough
  • Урок 86. 00:16:14
    2.6.3. Exercise 2.2. Problem Statement
  • Урок 87. 00:24:04
    2.6.4. Exercise 2.2. Walkthrough
  • Урок 88. 00:00:48
    2.7. Summary
  • Урок 89. 00:00:47
    3. Dynamic Proxies
  • Урок 90. 00:03:54
    3.0.1. Avoid Copy and Paste
  • Урок 91. 00:03:56
    3.1. Proxy.newProxyInstance()
  • Урок 92. 00:00:46
    3.1.1. IllegalArgumentException from Wrong ClassLoader
  • Урок 93. 00:01:14
    3.1.2. Correct ClassLoader Specified
  • Урок 94. 00:04:27
    3.1.3. Java Platform Module System
  • Урок 95. 00:01:39
    3.1.4. InvocationHandler
  • Урок 96. 00:01:14
    3.2. LoggingInvocationHandler
  • Урок 97. 00:03:52
    3.2.1. invoke() Method for LoggingInvocationHandler
  • Урок 98. 00:00:50
    3.2.2. toString() Prints Methods with Args
  • Урок 99. 00:01:22
    3.2.3. Demo of LoggingInvocationHandler
  • Урок 100. 00:00:29
    3.3. Dissecting a Dynamic Proxy
  • Урок 101. 00:01:04
    3.3.1. Dynamic Proxy Class Name
  • Урок 102. 00:00:49
    3.3.2. Decompiling $Proxy0
  • Урок 103. 00:06:42
    3.3.3. $Proxy0 Code Walkthrough
  • Урок 104. 00:01:30
    3.3.4. How Does $Proxy0 Work?
  • Урок 105. 00:04:46
    3.3.5. EscapeAnalysisTest of Arguments Array
  • Урок 106. 00:01:42
    3.3.6. Turbo-boosting Reflection Methods
  • Урок 107. 00:06:28
    3.3.6.1. TurboBoosterTest Demo
  • Урок 108. 00:02:03
    3.3.6.2. MethodTurboBooster Code Review
  • Урок 109. 00:00:16
    3.4. Recasted Exceptions
  • Урок 110. 00:00:31
    3.4.1. Unexpected Exceptions Causing Issues
  • Урок 111. 00:01:32
    3.4.2. RecastingExceptionsBroken
  • Урок 112. 00:01:31
    3.4.3. Unwrapping InvocationHandler
  • Урок 113. 00:00:27
    3.4.4. RecastingExceptionsFixed
  • Урок 114. 00:01:02
    3.5. Proxies Facade
  • Урок 115. 00:01:17
    3.5.1. Proxies.castProxy()
  • Урок 116. 00:00:54
    3.5.2. simpleProxy()
  • Урок 117. 00:00:51
    3.5.3. RealISODateParser
  • Урок 118. 00:01:18
    3.5.4. Using Proxies Facade
  • Урок 119. 00:01:05
    3.6. Virtual Dynamic Proxy
  • Урок 120. 00:00:27
    3.6.1. Proxies Facade virtualProxy()
  • Урок 121. 00:01:09
    3.6.2. Creating Virtual Proxy
  • Урок 122. 00:01:25
    3.6.3. Company and MoralFibre
  • Урок 123. 00:01:00
    3.6.4. CompanyTest
  • Урок 124. 00:01:03
    3.7. Synchronized Dynamic Proxy
  • Урок 125. 00:00:18
    3.7.1. Proxies Facade synchronizedProxy()
  • Урок 126. 00:00:52
    3.7.2. SynchronizedTest
  • Урок 127. 00:01:13
    3.8. Cascading Dynamic Proxies
  • Урок 128. 00:01:58
    3.9. EnhancedStream
  • Урок 129. 00:01:43
    3.9.1. EnhancedStream Code Review
  • Урок 130. 00:00:29
    3.10. Dynamic Proxy Restrictions
  • Урок 131. 00:00:37
    3.10.1. Interfaces Only
  • Урок 132. 00:00:33
    3.10.2. UndeclaredThrowableException
  • Урок 133. 00:00:59
    3.10.3. Return Types Have to be Correct
  • Урок 134. 00:01:33
    3.10.4. Naming Mysteries
  • Урок 135. 00:00:40
    3.10.5. Deeper Call Stacks
  • Урок 136. 00:01:48
    3.10.6. Shared Proxy Classes
  • Урок 137. 00:03:01
    3.11. Performance
  • Урок 138. 00:04:06
    3.11.1. Model for Benchmark using JMH
  • Урок 139. 00:01:38
    3.11.2. Benchmark increment() Results
  • Урок 140. 00:00:51
    3.11.3. Benchmark consumeCPU() Results
  • Урок 141. 00:00:41
    3.11.4. Summary of Benchmark Results
  • Урок 142. 00:00:16
    3.12. Exercises
  • Урок 143. 00:00:25
    3.12.1. Exercises 3.1. Problem Statement
  • Урок 144. 00:01:31
    3.12.2. Exercises 3.1. Walkthrough
  • Урок 145. 00:02:14
    3.12.3. Exercises 3.2. Problem Statement
  • Урок 146. 00:08:32
    3.12.4. Exercises 3.2. Walkthrough
  • Урок 147. 00:00:37
    4. Dynamic Decorator
  • Урок 148. 00:00:37
    4.0. Decorator Structure
  • Урок 149. 00:02:54
    4.1. Filtering for Immutability
  • Урок 150. 00:01:15
    4.1.1. ImmutableCollection
  • Урок 151. 00:01:05
    4.1.2. HandcodedFilter
  • Урок 152. 00:00:23
    4.1.3. MutableCollection
  • Урок 153. 00:01:05
    4.1.4. UML Diagram
  • Урок 154. 00:01:45
    4.1.5. HandcodedFilter Demo
  • Урок 155. 00:04:53
    4.2. FilterHandler
  • Урок 156. 00:04:55
    4.2.1. FilterHandler Class
  • Урок 157. 00:01:44
    4.2.2. Proxies Facade Gets filter() Method
  • Урок 158. 00:01:08
    4.2.3. Dynamic Filter Demo
  • Урок 159. 00:02:25
    4.2.4. What Happened?
  • Урок 160. 00:00:45
    4.3. VTable
  • Урок 161. 00:02:06
    4.3.1. VTable Overview
  • Урок 162. 00:04:49
    4.3.2. ParameterTypesFetcher
  • Урок 163. 00:04:53
    4.3.3. MethodKey
  • Урок 164. 00:03:58
    4.3.4. VTable
  • Урок 165. 00:07:39
    4.3.4.1. VTable put() and findIndex()
  • Урок 166. 00:03:31
    4.3.4.2. VTable.getDefaultMethodHandle()
  • Урок 167. 00:00:58
    4.3.4.3. Turbo-Boosting Methods in VTable
  • Урок 168. 00:03:41
    4.3.4.4. VTable.lookup() and stream()
  • Урок 169. 00:19:04
    4.3.5. VTable.Builder
  • Урок 170. 00:01:40
    4.3.6. VTables Facade
  • Урок 171. 00:00:23
    4.3.7. VTable Summary
  • Урок 172. 00:05:42
    4.4. ChainedInvocationHandler
  • Урок 173. 00:00:45
    4.4.1. UnhandledMethodException
  • Урок 174. 00:01:49
    4.4.2. VTableHandler
  • Урок 175. 00:01:32
    4.4.3. VTableDefaultMethodHandler
  • Урок 176. 00:05:35
    4.4.4. UnifiedInvocationHandler
  • Урок 177. 00:00:49
    4.5.1. Exercise 4.1. Problem Statement
  • Урок 178. 00:02:12
    4.5.2. Exercise 4.1. Walkthrough
  • Урок 179. 00:03:33
    4.5.3. Exercise 4.2. Problem Statement
  • Урок 180. 00:13:31
    4.5.4. Exercise 4.2. Walkthrough
  • Урок 181. 00:00:31
    5. Dynamic Object Adapter
  • Урок 182. 00:01:00
    5.0.1. Singer and Rapper
  • Урок 183. 00:01:13
    5.0.2. Class Adapter
  • Урок 184. 00:01:22
    5.0.3. Object Adapter
  • Урок 185. 00:00:13
    5.1. Better Collections
  • Урок 186. 00:02:32
    5.1.1.1. Generics Type Erasure
  • Урок 187. 00:02:18
    5.1.1.2. Demo of ArrayList
  • Урок 188. 00:02:45
    5.1.1.3. Covariant Return Types
  • Урок 189. 00:01:34
    5.1.2.1. BetterArrayList
  • Урок 190. 00:01:01
    5.1.2.2. Demo of BetterArrayList
  • Урок 191. 00:01:25
    5.1.3.1. BetterCollection Interface
  • Урок 192. 00:00:35
    5.1.3.2. BetterConcurrentSkipListSet
  • Урок 193. 00:01:17
    5.1.4.1. Object Adapter Pattern
  • Урок 194. 00:01:24
    5.1.4.2. BetterCollectionObjectAdapter
  • Урок 195. 00:00:25
    5.1.4.3. Demo of BetterCollectionObjectAdapter
  • Урок 196. 00:00:52
    5.1.4.4. What if we want to make a better Set, List, etc.?
  • Урок 197. 00:01:54
    5.1.5.1. ObjectAdapterHandler
  • Урок 198. 00:01:44
    5.1.5.2. Proxies.adapt()
  • Урок 199. 00:02:23
    5.1.5.3. BetterCollectionFactory
  • Урок 200. 00:01:16
    5.1.5.4. Demo of Dynamic Object Adapter
  • Урок 201. 00:01:10
    5.2.1. Dynamic Object Adapter Restrictions
  • Урок 202. 00:03:46
    5.2.2. AdapterPuzzle1
  • Урок 203. 00:01:08
    5.2.3. AdapterPuzzle2
  • Урок 204. 00:00:29
    5.3. Performance
  • Урок 205. 00:01:38
    5.3.1. Benchmark
  • Урок 206. 00:02:30
    5.3.2. JMH Benchmark Code
  • Урок 207. 00:01:10
    5.3.3. Benchmark size() Results
  • Урок 208. 00:01:00
    5.3.4. Benchmark toArray() Results
  • Урок 209. 00:01:49
    5.3.5. Benchmark forEachFiltered() Results
  • Урок 210. 00:01:52
    5.4.1. Exercise 5.1. Problem Statement
  • Урок 211. 00:05:22
    5.4.2. Exercise 5.1. Walkthrough
  • Урок 212. 00:01:17
    5.4.3. Exercise 5.2. Problem Statement
  • Урок 213. 00:05:48
    5.4.4. Exercise 5.2. Walkthrough
  • Урок 214. 00:01:25
    5.4.5. Exercise 5.3. Problem Statement
  • Урок 215. 00:11:08
    5.4.6. Exercise 5.3. Walkthrough
  • Урок 216. 00:03:22
    6. Dynamic Composite
  • Урок 217. 00:01:13
    6.0.1. Composite Structure
  • Урок 218. 00:01:07
    6.0.2. Visitor Pattern
  • Урок 219. 00:05:33
    6.0.3. add() and remove() in Component?
  • Урок 220. 00:03:02
    6.1. Mailing List
  • Урок 221. 00:00:56
    6.1.1. Contact and Person
  • Урок 222. 00:01:37
    6.1.2. DistributionList
  • Урок 223. 00:01:19
    6.1.3. Contact Class Diagram
  • Урок 224. 00:01:13
    6.1.4. Let's Build a Mailing List
  • Урок 225. 00:00:29
    6.1.5. Mailing List Object Graph
  • Урок 226. 00:00:35
    6.1.6. Composite Classes Look Similar
  • Урок 227. 00:00:52
    6.1.7. BaseComponent
  • Урок 228. 00:00:25
    6.1.8. Contact extends BaseComponent
  • Урок 229. 00:00:49
    6.1.9. BaseComponent Class Diagram
  • Урок 230. 00:00:54
    6.2. CompositeHandler
  • Урок 231. 00:01:48
    6.2.1. CompositeHandler Constructor
  • Урок 232. 00:01:22
    6.2.2. Matching add() and remove() methods
  • Урок 233. 00:01:43
    6.2.3. requiresAllInterfaces()
  • Урок 234. 00:07:03
    6.2.4. addChildMethods()
  • Урок 235. 00:01:09
    6.2.5. UncheckedException
  • Урок 236. 00:02:10
    6.2.6. mapFunction()
  • Урок 237. 00:03:01
    6.2.7. map and reduce
  • Урок 238. 00:00:45
    6.2.8. Reducer.PROXY_INSTANCE_REDUCER
  • Урок 239. 00:00:29
    6.2.9. Merging final result and unwrapping UncheckedException
  • Урок 240. 00:00:14
    6.2.10. CompositeHandler summary
  • Урок 241. 00:01:11
    6.2.11. Proxies.compose()
  • Урок 242. 00:00:57
    6.2.12. Dynamic Composite Contact
  • Урок 243. 00:01:16
    6.3. TeeAppendables
  • Урок 244. 00:00:53
    6.3.1. Demo of TeeOutputStream
  • Урок 245. 00:00:27
    6.3.2. OutputStreamComposite
  • Урок 246. 00:02:25
    6.3.3. Interfaces of OutputStream and Writer
  • Урок 247. 00:01:40
    6.3.4. TeeAppendable Handwritten Composite
  • Урок 248. 00:01:02
    6.3.5. Making TeeAppendable into Writer
  • Урок 249. 00:02:28
    6.3.6. Demo of TeeAppendable
  • Урок 250. 00:01:45
    6.4. AppendableFlushableCloseable
  • Урок 251. 00:00:59
    6.4.1. Composing Appendable Dynamically
  • Урок 252. 00:02:19
    6.5.1. Exercise 6.1. Problem Statement
  • Урок 253. 00:09:45
    6.5.2. Exercise 6.1. Walkthrough
  • Урок 254. 00:00:43
    6.5.3. Exercise 6.2. Problem Statement
  • Урок 255. 00:03:23
    6.5.4. Exercise 6.2. Walkthrough
  • Урок 256. 00:04:57
    7. Conclusion
Этот материал находится в платной подписке. Оформи премиум подписку и смотри Dynamic Proxies in Java, а также все другие курсы, прямо сейчас!
Премиум