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