Урок 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