[{"data":1,"prerenderedAt":3982},["ShallowReactive",2],{"item-lessons-light-ch23-encapsulation-and-final":3,"item-examples-light-ch23-encapsulation-and-final":444,"item-exercises-light-ch23-encapsulation-and-final":753,"item-lesson-full-ch23-encapsulation-and-final-23.1":1070,"item-example-full-ch23-encapsulation-and-final-23.1":2008,"item-exercise-full-ch23-encapsulation-and-final-23.1":2732},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":606,"title":607,"stem":608},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":763,"title":764,"stem":765},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":767,"title":768,"stem":769},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":771,"title":772,"stem":773},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":775,"title":776,"stem":777},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":779,"title":780,"stem":781},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":783,"title":784,"stem":785},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":787,"title":788,"stem":789},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":791,"title":792,"stem":793},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":795,"title":796,"stem":797},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":799,"title":800,"stem":801},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":803,"title":804,"stem":805},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":807,"title":808,"stem":809},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":811,"title":812,"stem":813},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":815,"title":816,"stem":817},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":843,"title":844,"stem":845},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":847,"title":848,"stem":849},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":871,"title":872,"stem":873},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":875,"title":876,"stem":877},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":879,"title":880,"stem":881},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":883,"title":884,"stem":885},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":887,"title":888,"stem":889},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":891,"title":892,"stem":893},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":915,"title":916,"stem":917},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":262,"body":1072,"description":1082,"extension":2002,"meta":2003,"navigation":1341,"path":261,"seo":2006,"stem":263,"__hash__":2007},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access.md",{"type":1073,"value":1074,"toc":1992},"minimark",[1075,1079,1083,1088,1100,1153,1244,1256,1263,1268,1278,1306,1318,1369,1383,1391,1454,1473,1486,1511,1522,1552,1556,1562,1607,1643,1650,1678,1688,1692,1699,1750,1770,1814,1818,1821,1857,1861,1901,1905,1956,1988],[1076,1077,262],"h1",{"id":1078},"access-final-and-immutability",[1080,1081,1082],"p",{},"Lesson 7.2 already covered where a variable lives — class, method, or block scope — and what happens when a local variable or parameter shadows a field. This lesson builds on that background rather than repeating it: it's about two different questions. Who, outside a class, is allowed to touch a piece of its data? And what can be guaranteed to never change once it's set?",[1084,1085,1087],"h2",{"id":1086},"access-modifiers-four-levels","Access Modifiers: Four Levels",[1080,1089,1090,1091,1095,1096,1099],{},"Java actually has four access levels, not two. ",[1092,1093,1094],"code",{},"public"," and ",[1092,1097,1098],{},"private"," are the ones used everywhere so far; the other two sit in between:",[1101,1102,1107],"pre",{"className":1103,"code":1104,"language":1105,"meta":1106,"style":1106},"language-java shiki shiki-themes github-light github-dark","public class Intake\n{\n    public String status;        \u002F\u002F reachable from anywhere\n    protected double maxSpeed;   \u002F\u002F reachable from the same package, or any subclass\n    double gearRatio;            \u002F\u002F no modifier — reachable only from the same package\n    private boolean calibrated;  \u002F\u002F reachable only from inside Intake itself\n}\n","java","",[1092,1108,1109,1117,1123,1129,1135,1141,1147],{"__ignoreMap":1106},[1110,1111,1114],"span",{"class":1112,"line":1113},"line",1,[1110,1115,1116],{},"public class Intake\n",[1110,1118,1120],{"class":1112,"line":1119},2,[1110,1121,1122],{},"{\n",[1110,1124,1126],{"class":1112,"line":1125},3,[1110,1127,1128],{},"    public String status;        \u002F\u002F reachable from anywhere\n",[1110,1130,1132],{"class":1112,"line":1131},4,[1110,1133,1134],{},"    protected double maxSpeed;   \u002F\u002F reachable from the same package, or any subclass\n",[1110,1136,1138],{"class":1112,"line":1137},5,[1110,1139,1140],{},"    double gearRatio;            \u002F\u002F no modifier — reachable only from the same package\n",[1110,1142,1144],{"class":1112,"line":1143},6,[1110,1145,1146],{},"    private boolean calibrated;  \u002F\u002F reachable only from inside Intake itself\n",[1110,1148,1150],{"class":1112,"line":1149},7,[1110,1151,1152],{},"}\n",[1154,1155,1156,1178],"table",{},[1157,1158,1159],"thead",{},[1160,1161,1162,1166,1169,1172,1175],"tr",{},[1163,1164,1165],"th",{},"Modifier",[1163,1167,1168],{},"Same class",[1163,1170,1171],{},"Same package",[1163,1173,1174],{},"Subclass (different package)",[1163,1176,1177],{},"Everywhere",[1179,1180,1181,1197,1213,1230],"tbody",{},[1160,1182,1183,1188,1191,1193,1195],{},[1184,1185,1186],"td",{},[1092,1187,1094],{},[1184,1189,1190],{},"Yes",[1184,1192,1190],{},[1184,1194,1190],{},[1184,1196,1190],{},[1160,1198,1199,1204,1206,1208,1210],{},[1184,1200,1201],{},[1092,1202,1203],{},"protected",[1184,1205,1190],{},[1184,1207,1190],{},[1184,1209,1190],{},[1184,1211,1212],{},"No",[1160,1214,1215,1222,1224,1226,1228],{},[1184,1216,1217,1221],{},[1218,1219,1220],"em",{},"(none)"," — package-private",[1184,1223,1190],{},[1184,1225,1190],{},[1184,1227,1212],{},[1184,1229,1212],{},[1160,1231,1232,1236,1238,1240,1242],{},[1184,1233,1234],{},[1092,1235,1098],{},[1184,1237,1190],{},[1184,1239,1212],{},[1184,1241,1212],{},[1184,1243,1212],{},[1080,1245,1246,1248,1249,1251,1252,1255],{},[1092,1247,1203],{}," came up briefly in Lesson 17.2: it's what lets a subclass reach a superclass's member directly, without going through a getter — this table is the full picture, including package-private (no keyword at all, the default when a field or class has none of the other three). This course keeps fields ",[1092,1250,1098],{}," and reaches them through getters\u002Fsetters or ",[1092,1253,1254],{},"super(...)",", but real WPILib code uses all four.",[1084,1257,1259,1262],{"id":1258},"final-not-just-for-fields",[1092,1260,1261],{},"final",": Not Just for Fields",[1080,1264,1265,1267],{},[1092,1266,1261],{}," can mark a local variable, a parameter, a field, a method, or a whole class — and it means something related but slightly different in each place.",[1080,1269,1270,1274,1275,1277],{},[1271,1272,1273],"strong",{},"Locals and parameters:"," a ",[1092,1276,1261],{}," local variable or parameter can be assigned exactly once, same as a field:",[1101,1279,1281],{"className":1103,"code":1280,"language":1105,"meta":1106,"style":1106},"public double clamp(final double target, double limit)\n{\n    \u002F\u002F target = -target; would be a compile error here — target is final\n    return Math.min(target, limit);\n}\n",[1092,1282,1283,1288,1292,1297,1302],{"__ignoreMap":1106},[1110,1284,1285],{"class":1112,"line":1113},[1110,1286,1287],{},"public double clamp(final double target, double limit)\n",[1110,1289,1290],{"class":1112,"line":1119},[1110,1291,1122],{},[1110,1293,1294],{"class":1112,"line":1125},[1110,1295,1296],{},"    \u002F\u002F target = -target; would be a compile error here — target is final\n",[1110,1298,1299],{"class":1112,"line":1131},[1110,1300,1301],{},"    return Math.min(target, limit);\n",[1110,1303,1304],{"class":1112,"line":1137},[1110,1305,1152],{},[1080,1307,1308,1274,1311,1313,1314,1317],{},[1271,1309,1310],{},"Fields, and the blank final rule:",[1092,1312,1261],{}," field doesn't have to be given a value in its declaration — it can stay ",[1218,1315,1316],{},"blank"," there, as long as every constructor assigns it exactly once, on every path through that constructor:",[1101,1319,1321],{"className":1103,"code":1320,"language":1105,"meta":1106,"style":1106},"class BatteryMonitor\n{\n    private final String label;   \u002F\u002F no initializer here — that's legal\n\n    public BatteryMonitor(String label)\n    {\n        this.label = label;       \u002F\u002F as long as every constructor assigns it exactly once\n    }\n}\n",[1092,1322,1323,1328,1332,1337,1343,1348,1353,1358,1364],{"__ignoreMap":1106},[1110,1324,1325],{"class":1112,"line":1113},[1110,1326,1327],{},"class BatteryMonitor\n",[1110,1329,1330],{"class":1112,"line":1119},[1110,1331,1122],{},[1110,1333,1334],{"class":1112,"line":1125},[1110,1335,1336],{},"    private final String label;   \u002F\u002F no initializer here — that's legal\n",[1110,1338,1339],{"class":1112,"line":1131},[1110,1340,1342],{"emptyLinePlaceholder":1341},true,"\n",[1110,1344,1345],{"class":1112,"line":1137},[1110,1346,1347],{},"    public BatteryMonitor(String label)\n",[1110,1349,1350],{"class":1112,"line":1143},[1110,1351,1352],{},"    {\n",[1110,1354,1355],{"class":1112,"line":1149},[1110,1356,1357],{},"        this.label = label;       \u002F\u002F as long as every constructor assigns it exactly once\n",[1110,1359,1361],{"class":1112,"line":1360},8,[1110,1362,1363],{},"    }\n",[1110,1365,1367],{"class":1112,"line":1366},9,[1110,1368,1152],{},[1080,1370,1371,1372,1374,1375,1378,1379,1382],{},"Leave a blank ",[1092,1373,1261],{}," field unassigned in some constructor, and it's a compile error — ",[1092,1376,1377],{},"variable label might not have been initialized"," — not a ",[1092,1380,1381],{},"null"," at runtime.",[1080,1384,1385,1274,1388,1390],{},[1271,1386,1387],{},"Methods:",[1092,1389,1261],{}," method can't be overridden by a subclass, full stop:",[1101,1392,1394],{"className":1103,"code":1393,"language":1105,"meta":1106,"style":1106},"class RobotPart\n{\n    public final String getName() { return name; }\n    \u002F\u002F ...\n}\n\nclass Intake extends RobotPart\n{\n    @Override\n    public String getName() { return \"Intake\"; }\n    \u002F\u002F COMPILE ERROR — getName() is final in RobotPart\n}\n",[1092,1395,1396,1401,1405,1410,1415,1419,1423,1428,1432,1437,1443,1449],{"__ignoreMap":1106},[1110,1397,1398],{"class":1112,"line":1113},[1110,1399,1400],{},"class RobotPart\n",[1110,1402,1403],{"class":1112,"line":1119},[1110,1404,1122],{},[1110,1406,1407],{"class":1112,"line":1125},[1110,1408,1409],{},"    public final String getName() { return name; }\n",[1110,1411,1412],{"class":1112,"line":1131},[1110,1413,1414],{},"    \u002F\u002F ...\n",[1110,1416,1417],{"class":1112,"line":1137},[1110,1418,1152],{},[1110,1420,1421],{"class":1112,"line":1143},[1110,1422,1342],{"emptyLinePlaceholder":1341},[1110,1424,1425],{"class":1112,"line":1149},[1110,1426,1427],{},"class Intake extends RobotPart\n",[1110,1429,1430],{"class":1112,"line":1360},[1110,1431,1122],{},[1110,1433,1434],{"class":1112,"line":1366},[1110,1435,1436],{},"    @Override\n",[1110,1438,1440],{"class":1112,"line":1439},10,[1110,1441,1442],{},"    public String getName() { return \"Intake\"; }\n",[1110,1444,1446],{"class":1112,"line":1445},11,[1110,1447,1448],{},"    \u002F\u002F COMPILE ERROR — getName() is final in RobotPart\n",[1110,1450,1452],{"class":1112,"line":1451},12,[1110,1453,1152],{},[1080,1455,1456,1274,1459,1461,1462,1465,1466,1469,1470,1472],{},[1271,1457,1458],{},"Classes:",[1092,1460,1261],{}," class can't be extended by anything, anywhere — ",[1092,1463,1464],{},"String"," is one, which is why ",[1092,1467,1468],{},"class MyString extends String"," never compiles. Records (below) are implicitly ",[1092,1471,1261],{}," too.",[1080,1474,1475,1478,1479,1481,1482,1485],{},[1271,1476,1477],{},"Effectively final:"," a local variable captured by a lambda (Lesson 19.1) doesn't have to be declared ",[1092,1480,1261],{},", but it does have to ",[1218,1483,1484],{},"behave"," like one — never reassigned anywhere after its first assignment, anywhere in the method:",[1101,1487,1489],{"className":1103,"code":1488,"language":1105,"meta":1106,"style":1106},"double baseSpeed = 0.5;\nbaseSpeed = 0.6;\nRunnable r = () -> System.out.println(baseSpeed);\n\u002F\u002F COMPILE ERROR — baseSpeed isn't effectively final\n",[1092,1490,1491,1496,1501,1506],{"__ignoreMap":1106},[1110,1492,1493],{"class":1112,"line":1113},[1110,1494,1495],{},"double baseSpeed = 0.5;\n",[1110,1497,1498],{"class":1112,"line":1119},[1110,1499,1500],{},"baseSpeed = 0.6;\n",[1110,1502,1503],{"class":1112,"line":1125},[1110,1504,1505],{},"Runnable r = () -> System.out.println(baseSpeed);\n",[1110,1507,1508],{"class":1112,"line":1131},[1110,1509,1510],{},"\u002F\u002F COMPILE ERROR — baseSpeed isn't effectively final\n",[1080,1512,1513,1514,1517,1518,1521],{},"That reassignment on the line before disqualifies ",[1092,1515,1516],{},"baseSpeed"," the moment the lambda tries to capture it: ",[1092,1519,1520],{},"local variables referenced from a lambda expression must be final or effectively final",".",[1080,1523,1524,1525,1528,1529,1532,1533,1536,1537,1540,1541,1544,1545,1547,1548,1551],{},"On an object reference, all of this only ever locks ",[1218,1526,1527],{},"the reference itself"," — a ",[1092,1530,1531],{},"final Encoder armEncoder = new Encoder(0, 1);"," can never be pointed at a different ",[1092,1534,1535],{},"Encoder"," (WPILib's real ",[1092,1538,1539],{},"org.wpilib.hardware.rotation.Encoder",", ",[1092,1542,1543],{},"getRate()"," reads its current rate), but nothing about ",[1092,1546,1261],{}," stops ",[1092,1549,1550],{},"armEncoder","'s own internal state from changing as it spins. That gap between \"the reference can't change\" and \"nothing about the object can change\" is exactly what the rest of this lesson is about.",[1084,1553,1555],{"id":1554},"encapsulation-leaks-defensive-copies","Encapsulation Leaks: Defensive Copies",[1080,1557,1558,1559,1561],{},"Marking a field ",[1092,1560,1098],{}," isn't automatically enough to protect it — a getter that hands back a direct reference to a mutable field leaks the class's internal state anyway:",[1101,1563,1565],{"className":1103,"code":1564,"language":1105,"meta":1106,"style":1106},"class PitNotes\n{\n    private final ArrayList\u003CString> notes = new ArrayList\u003CString>();\n\n    public ArrayList\u003CString> getNotes()\n    {\n        return notes; \u002F\u002F leak — the caller now holds the SAME list object\n    }\n}\n",[1092,1566,1567,1572,1576,1581,1585,1590,1594,1599,1603],{"__ignoreMap":1106},[1110,1568,1569],{"class":1112,"line":1113},[1110,1570,1571],{},"class PitNotes\n",[1110,1573,1574],{"class":1112,"line":1119},[1110,1575,1122],{},[1110,1577,1578],{"class":1112,"line":1125},[1110,1579,1580],{},"    private final ArrayList\u003CString> notes = new ArrayList\u003CString>();\n",[1110,1582,1583],{"class":1112,"line":1131},[1110,1584,1342],{"emptyLinePlaceholder":1341},[1110,1586,1587],{"class":1112,"line":1137},[1110,1588,1589],{},"    public ArrayList\u003CString> getNotes()\n",[1110,1591,1592],{"class":1112,"line":1143},[1110,1593,1352],{},[1110,1595,1596],{"class":1112,"line":1149},[1110,1597,1598],{},"        return notes; \u002F\u002F leak — the caller now holds the SAME list object\n",[1110,1600,1601],{"class":1112,"line":1360},[1110,1602,1363],{},[1110,1604,1605],{"class":1112,"line":1366},[1110,1606,1152],{},[1080,1608,1609,1610,1613,1614,1095,1616,1618,1619,1622,1623,1540,1626,1629,1630,1632,1633,1635,1636,1638,1639,1642],{},"Even though ",[1092,1611,1612],{},"notes"," is ",[1092,1615,1098],{},[1092,1617,1261],{},", this getter hands out a reference to the exact list ",[1092,1620,1621],{},"PitNotes"," uses internally. Anything the caller does to that returned list — ",[1092,1624,1625],{},"getNotes().clear()",[1092,1627,1628],{},"getNotes().add(...)"," — changes ",[1092,1631,1621],{},"'s own data, without ever calling one of ",[1092,1634,1621],{},"'s own methods. ",[1092,1637,1098],{}," only stops outside code from writing ",[1092,1640,1641],{},"somePitNotes.notes"," directly; it does nothing once a reference to the same object escapes through a getter.",[1080,1644,1645,1646,1649],{},"The fix is a ",[1271,1647,1648],{},"defensive copy"," — hand back a new object with the same contents, instead of the original:",[1101,1651,1653],{"className":1103,"code":1652,"language":1105,"meta":1106,"style":1106},"public List\u003CString> getNotes()\n{\n    \u002F\u002F a defensive copy — an unmodifiable snapshot, not the real list\n    return List.copyOf(notes);\n}\n",[1092,1654,1655,1660,1664,1669,1674],{"__ignoreMap":1106},[1110,1656,1657],{"class":1112,"line":1113},[1110,1658,1659],{},"public List\u003CString> getNotes()\n",[1110,1661,1662],{"class":1112,"line":1119},[1110,1663,1122],{},[1110,1665,1666],{"class":1112,"line":1125},[1110,1667,1668],{},"    \u002F\u002F a defensive copy — an unmodifiable snapshot, not the real list\n",[1110,1670,1671],{"class":1112,"line":1131},[1110,1672,1673],{},"    return List.copyOf(notes);\n",[1110,1675,1676],{"class":1112,"line":1137},[1110,1677,1152],{},[1080,1679,1680,1681,1683,1684,1687],{},"Now the caller gets its own snapshot; mutating it can't touch ",[1092,1682,1621],{},"'s real data at all, and ",[1092,1685,1686],{},"List.copyOf(...)"," refuses to be modified even by accident.",[1084,1689,1691],{"id":1690},"records-immutable-data-built-in","Records: Immutable Data, Built In",[1080,1693,1694,1695,1698],{},"When a class is really just a bundle of values — no behavior beyond holding them — Java's ",[1092,1696,1697],{},"record"," (16+) writes the immutable version of it for you:",[1101,1700,1702],{"className":1103,"code":1701,"language":1105,"meta":1106,"style":1106},"public record Reading(double volts, double timestampSeconds)\n{\n    public Reading\n    {\n        if (volts \u003C 0)\n        {\n            throw new IllegalArgumentException(\"volts can't be negative\");\n        }\n    }\n}\n",[1092,1703,1704,1709,1713,1718,1722,1727,1732,1737,1742,1746],{"__ignoreMap":1106},[1110,1705,1706],{"class":1112,"line":1113},[1110,1707,1708],{},"public record Reading(double volts, double timestampSeconds)\n",[1110,1710,1711],{"class":1112,"line":1119},[1110,1712,1122],{},[1110,1714,1715],{"class":1112,"line":1125},[1110,1716,1717],{},"    public Reading\n",[1110,1719,1720],{"class":1112,"line":1131},[1110,1721,1352],{},[1110,1723,1724],{"class":1112,"line":1137},[1110,1725,1726],{},"        if (volts \u003C 0)\n",[1110,1728,1729],{"class":1112,"line":1143},[1110,1730,1731],{},"        {\n",[1110,1733,1734],{"class":1112,"line":1149},[1110,1735,1736],{},"            throw new IllegalArgumentException(\"volts can't be negative\");\n",[1110,1738,1739],{"class":1112,"line":1360},[1110,1740,1741],{},"        }\n",[1110,1743,1744],{"class":1112,"line":1366},[1110,1745,1363],{},[1110,1747,1748],{"class":1112,"line":1439},[1110,1749,1152],{},[1101,1751,1753],{"className":1103,"code":1752,"language":1105,"meta":1106,"style":1106},"Reading r = new Reading(12.6, 41.2);\nSystem.out.println(r.volts());   \u002F\u002F an accessor named after the field, not getVolts()\nSystem.out.println(r);           \u002F\u002F Reading[volts=12.6, timestampSeconds=41.2]\n",[1092,1754,1755,1760,1765],{"__ignoreMap":1106},[1110,1756,1757],{"class":1112,"line":1113},[1110,1758,1759],{},"Reading r = new Reading(12.6, 41.2);\n",[1110,1761,1762],{"class":1112,"line":1119},[1110,1763,1764],{},"System.out.println(r.volts());   \u002F\u002F an accessor named after the field, not getVolts()\n",[1110,1766,1767],{"class":1112,"line":1125},[1110,1768,1769],{},"System.out.println(r);           \u002F\u002F Reading[volts=12.6, timestampSeconds=41.2]\n",[1080,1771,1772,1773,1776,1777,1780,1781,1540,1784,1787,1788,1791,1792,1540,1795,1798,1799,1802,1803,1806,1807,1810,1811,1813],{},"One line — ",[1092,1774,1775],{},"record Reading(double volts, double timestampSeconds)"," — generates ",[1092,1778,1779],{},"private final"," fields for both, a constructor, read-only accessors (",[1092,1782,1783],{},"volts()",[1092,1785,1786],{},"timestampSeconds()",", no ",[1092,1789,1790],{},"get"," prefix), and working ",[1092,1793,1794],{},"equals",[1092,1796,1797],{},"hashCode",", and ",[1092,1800,1801],{},"toString",", all for free. The block after the field list, called a ",[1218,1804,1805],{},"compact constructor",", is optional — it runs before the fields are assigned, purely to validate the arguments (as above); no ",[1092,1808,1809],{},"this.volts = volts;"," is written or needed there, since that assignment still happens automatically. A record is implicitly ",[1092,1812,1261],{}," — nothing can extend it.",[1084,1815,1817],{"id":1816},"an-immutability-checklist","An Immutability Checklist",[1080,1819,1820],{},"Pulling the pieces above together, a class is genuinely immutable once every one of these holds:",[1822,1823,1824,1830,1833,1851],"ul",{},[1825,1826,1827,1828,1521],"li",{},"Every field is ",[1092,1829,1779],{},[1825,1831,1832],{},"Nothing but a constructor (or compact constructor, for a record) ever assigns a field — no setters.",[1825,1834,1835,1836,1839,1840,1843,1844,1847,1848,1850],{},"Any field that's itself a mutable type (an array, or a collection like ",[1092,1837,1838],{},"ArrayList",") is defensively copied going ",[1218,1841,1842],{},"in",", through the constructor, and copied going ",[1218,1845,1846],{},"out",", through any getter — ",[1092,1849,1261],{}," alone only locks the reference, not the referenced object's own contents.",[1825,1852,1853,1854,1856],{},"When the class is really just a bundle of values, reach for a ",[1092,1855,1697],{}," first — it satisfies every bullet above by construction.",[1084,1858,1860],{"id":1859},"common-pitfalls","Common Pitfalls",[1822,1862,1863,1879,1891],{},[1825,1864,1865,1868,1869,1871,1872,1874,1875,1878],{},[1271,1866,1867],{},"Returning a mutable field directly from a getter."," ",[1092,1870,1098],{}," doesn't protect a field once a reference to it escapes through a getter — return a defensive copy (",[1092,1873,1686],{},", or ",[1092,1876,1877],{},"new ArrayList\u003C>(original)",") instead of the original object.",[1825,1880,1881,1887,1888,1890],{},[1271,1882,1883,1884,1886],{},"Leaving a blank ",[1092,1885,1261],{}," field unassigned on some constructor path."," Every constructor must assign it exactly once — missing it on even one path is a compile error, not a ",[1092,1889,1381],{}," waiting to happen.",[1825,1892,1893,1896,1897,1900],{},[1271,1894,1895],{},"Reassigning a variable after using it in a lambda."," A captured local only has to be ",[1218,1898,1899],{},"effectively"," final, but reassigning it anywhere in the method — even after the lambda — breaks that, and the lambda's capture is what fails to compile.",[1084,1902,1904],{"id":1903},"key-takeaways","Key Takeaways",[1822,1906,1907,1921,1926,1932,1938,1953],{},[1825,1908,1909,1910,1540,1912,1914,1915,1917,1918,1920],{},"Java has four access levels — ",[1092,1911,1094],{},[1092,1913,1203],{},", package-private (no modifier), and ",[1092,1916,1098],{}," — differing in whether same-package code and subclasses in other packages can reach a member; Lesson 17.2 introduced ",[1092,1919,1203],{},", this table is the full comparison.",[1825,1922,1923,1925],{},[1092,1924,1261],{}," means \"assign exactly once\" for locals, parameters, and fields (with the blank-final rule allowing one later assignment per constructor); on a method it blocks overriding, and on a class it blocks extending entirely.",[1825,1927,1928,1929,1931],{},"A lambda can only capture a local variable that's final or ",[1218,1930,1899],{}," final — never reassigned anywhere in the method.",[1825,1933,1934,1935,1937],{},"A ",[1092,1936,1098],{}," field isn't automatically safe from outside mutation — a getter that hands back the same mutable object leaks it; return a defensive copy instead.",[1825,1939,1934,1940,1942,1943,1945,1946,1540,1948,1798,1950,1952],{},[1092,1941,1697],{}," generates an immutable, implicitly-",[1092,1944,1261],{}," class — fields, accessors, ",[1092,1947,1794],{},[1092,1949,1797],{},[1092,1951,1801],{}," — from one line, with an optional compact constructor for validation.",[1825,1954,1955],{},"Scope and shadowing (where a variable lives, and what happens when a local name matches a field's) were covered in Lesson 7.2.",[1080,1957,1958,1959,1962,1963,1966,1967,1970,1971,1973,1974,1976,1977,1979,1980,1983,1984,1987],{},"Derived from ",[1092,1960,1961],{},"csawesome-2026",": ",[1092,1964,1965],{},"unit-3-class-creation\u002F3.08-scope-and-access.md"," (CSA 3.8)\n",[1271,1968,1969],{},"Deck context:"," mechacoder-test\u002Fsrc\u002Flessons\u002Fjava-2.js, slide 9 (\"Encapsulation & Final\") — refocused 2026-09-25 on access modifiers, ",[1092,1972,1261],{},", encapsulation leaks, and records (scope moved to Lesson 7.2); real-API check: ",[1092,1975,1539],{}," (",[1092,1978,1543],{},"), allwpilib ",[1092,1981,1982],{},"main"," commit ",[1092,1985,1986],{},"e985b0fdfce935cb1484d4b9e8d1b98bd391bb51"," (2026-09-25)",[1989,1990,1991],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1106,"searchDepth":1119,"depth":1119,"links":1993},[1994,1995,1997,1998,1999,2000,2001],{"id":1086,"depth":1119,"text":1087},{"id":1258,"depth":1119,"text":1996},"final: Not Just for Fields",{"id":1554,"depth":1119,"text":1555},{"id":1690,"depth":1119,"text":1691},{"id":1816,"depth":1119,"text":1817},{"id":1859,"depth":1119,"text":1860},{"id":1903,"depth":1119,"text":1904},"md",{"outlineRef":2004,"status":2005},"23.1 — Scope and Access (CSA 3.8)","new — authored lesson (fuller depth than the teaser slide)",{"title":262,"description":1082},"MtH5iiPPcXI07nKZ2L-x4LdC-EI7o93w4BZ6C5VpQ0M",{"id":2009,"title":695,"body":2010,"description":1106,"extension":2002,"meta":2727,"navigation":1341,"path":694,"seo":2730,"stem":696,"__hash__":2731},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access.md",{"type":1073,"value":2011,"toc":2715},[2012,2015,2019,2029,2033,2078,2082,2114,2122,2126,2158,2173,2177,2200,2227,2231,2261,2528,2532,2540,2552,2556,2565,2588,2616,2620,2623,2671,2675,2713],[1076,2013,695],{"id":2014},"access-final-and-immutability-worked-example",[1084,2016,2018],{"id":2017},"problem","Problem",[1080,2020,2021,2022,2025,2026,2028],{},"Write a ",[1092,2023,2024],{},"MatchLog"," for one match. It has a match number, set once when the log is created and never changed afterward, and a list of scoring events recorded as the match happens. Other code needs to read those events for the dashboard — but must never be able to change ",[1092,2027,2024],{},"'s own data just by editing whatever it gets back.",[1084,2030,2032],{"id":2031},"step-1-plan-it-first","Step 1: Plan It First",[2034,2035,2036,2046,2056,2066,2072],"ol",{},[1825,2037,2038,2039,2042,2043,2045],{},"Declare ",[1092,2040,2041],{},"matchNumber"," as a blank ",[1092,2044,1261],{}," field, assigned in the constructor.",[1825,2047,2038,2048,2051,2052,2055],{},[1092,2049,2050],{},"events"," as a ",[1092,2053,2054],{},"private final ArrayList\u003CString>",", so it can never be pointed at a different list.",[1825,2057,2058,2059,2062,2063,2065],{},"Write ",[1092,2060,2061],{},"record(...)",", which only ever adds to ",[1092,2064,2050],{},", never reassigns it.",[1825,2067,2058,2068,2071],{},[1092,2069,2070],{},"getEvents()"," to return a defensive copy, not the real list.",[1825,2073,2074,2075,2077],{},"In ",[1092,2076,1982],{},", show that copy really is safe to hand out.",[1084,2079,2081],{"id":2080},"step-2-the-blank-final-match-number","Step 2: The Blank Final Match Number",[1101,2083,2085],{"className":1103,"code":2084,"language":1105,"meta":1106,"style":1106},"private final int matchNumber;\n\npublic MatchLog(int matchNumber)\n{\n    this.matchNumber = matchNumber;\n}\n",[1092,2086,2087,2092,2096,2101,2105,2110],{"__ignoreMap":1106},[1110,2088,2089],{"class":1112,"line":1113},[1110,2090,2091],{},"private final int matchNumber;\n",[1110,2093,2094],{"class":1112,"line":1119},[1110,2095,1342],{"emptyLinePlaceholder":1341},[1110,2097,2098],{"class":1112,"line":1125},[1110,2099,2100],{},"public MatchLog(int matchNumber)\n",[1110,2102,2103],{"class":1112,"line":1131},[1110,2104,1122],{},[1110,2106,2107],{"class":1112,"line":1137},[1110,2108,2109],{},"    this.matchNumber = matchNumber;\n",[1110,2111,2112],{"class":1112,"line":1143},[1110,2113,1152],{},[1080,2115,2116,2118,2119,1521],{},[1092,2117,2041],{}," has no initializer in its declaration — that's legal, because the constructor assigns it exactly once, on the one path through this constructor (the blank final rule). Leaving it unassigned here would be a compile error: ",[1092,2120,2121],{},"variable matchNumber might not have been initialized",[1084,2123,2125],{"id":2124},"step-3-recording-events","Step 3: Recording Events",[1101,2127,2129],{"className":1103,"code":2128,"language":1105,"meta":1106,"style":1106},"private final ArrayList\u003CString> events = new ArrayList\u003CString>();\n\npublic void record(String event)\n{\n    events.add(event);\n}\n",[1092,2130,2131,2136,2140,2145,2149,2154],{"__ignoreMap":1106},[1110,2132,2133],{"class":1112,"line":1113},[1110,2134,2135],{},"private final ArrayList\u003CString> events = new ArrayList\u003CString>();\n",[1110,2137,2138],{"class":1112,"line":1119},[1110,2139,1342],{"emptyLinePlaceholder":1341},[1110,2141,2142],{"class":1112,"line":1125},[1110,2143,2144],{},"public void record(String event)\n",[1110,2146,2147],{"class":1112,"line":1131},[1110,2148,1122],{},[1110,2150,2151],{"class":1112,"line":1137},[1110,2152,2153],{},"    events.add(event);\n",[1110,2155,2156],{"class":1112,"line":1143},[1110,2157,1152],{},[1080,2159,2160,1613,2162,2164,2165,2168,2169,2172],{},[1092,2161,2050],{},[1092,2163,1261],{}," too — it can never be pointed at a different list — but ",[1092,2166,2167],{},"add(...)"," only changes what's ",[1218,2170,2171],{},"inside"," the list, so this still compiles.",[1084,2174,2176],{"id":2175},"step-4-returning-events-without-leaking-them","Step 4: Returning Events Without Leaking Them",[1101,2178,2180],{"className":1103,"code":2179,"language":1105,"meta":1106,"style":1106},"public List\u003CString> getEvents()\n{\n    return List.copyOf(events);\n}\n",[1092,2181,2182,2187,2191,2196],{"__ignoreMap":1106},[1110,2183,2184],{"class":1112,"line":1113},[1110,2185,2186],{},"public List\u003CString> getEvents()\n",[1110,2188,2189],{"class":1112,"line":1119},[1110,2190,1122],{},[1110,2192,2193],{"class":1112,"line":1125},[1110,2194,2195],{},"    return List.copyOf(events);\n",[1110,2197,2198],{"class":1112,"line":1131},[1110,2199,1152],{},[1080,2201,2202,2203,2206,2207,2209,2210,1540,2213,2216,2217,2219,2220,2222,2223,2226],{},"Compare that with the leaky version this worked example is deliberately avoiding: ",[1092,2204,2205],{},"public ArrayList\u003CString> getEvents() { return events; }"," hands back the exact list ",[1092,2208,2024],{}," uses internally — anything the caller does to it (",[1092,2211,2212],{},".clear()",[1092,2214,2215],{},".add(...)",") changes ",[1092,2218,2024],{},"'s real data, with none of ",[1092,2221,2024],{},"'s own methods ever running. ",[1092,2224,2225],{},"List.copyOf(events)"," instead gives the caller an unmodifiable snapshot.",[1084,2228,2230],{"id":2229},"step-5-the-whole-program","Step 5: The Whole Program",[1080,2232,2233,2234,2237,2238,2240,2241,2243,2244,2246,2247,2249,2250,2253,2254,2257,2258,2260],{},"To run this as one file, both classes go in ",[1092,2235,2236],{},"MatchLogCheck.java",". Java allows only one ",[1092,2239,1094],{}," class per file — the one whose name matches the file — so ",[1092,2242,2024],{}," is written without ",[1092,2245,1094],{},". The class holding ",[1092,2248,1982],{}," goes first: on Java 17, running a file with ",[1092,2251,2252],{},"java MatchLogCheck.java"," starts the ",[1218,2255,2256],{},"first"," class in the file, so ",[1092,2259,1982],{}," must live there. Java 25 is more forgiving (it also finds the class named after the file), but main-class-first works on both, so every multi-class program in this course uses it.",[1101,2262,2264],{"className":1103,"code":2263,"language":1105,"meta":1106,"style":1106},"import java.util.ArrayList;\nimport java.util.List;\n\npublic class MatchLogCheck\n{\n    public static void main(String[] args)\n    {\n        MatchLog log = new MatchLog(42);\n        log.record(\"Auto: scored 2 notes\");\n        log.record(\"Teleop: climbed\");\n\n        List\u003CString> events = log.getEvents();\n        System.out.println(\"Match \" + log.getMatchNumber() + \": \" + events);\n\n        try\n        {\n            events.add(\"Hacked entry\");\n        }\n        catch (UnsupportedOperationException e)\n        {\n            System.out.println(\"getEvents() is safe: \" + e.getClass().getSimpleName());\n        }\n    }\n}\n\nclass MatchLog\n{\n    private final int matchNumber;\n    private final ArrayList\u003CString> events = new ArrayList\u003CString>();\n\n    public MatchLog(int matchNumber)\n    {\n        this.matchNumber = matchNumber;\n    }\n\n    public void record(String event)\n    {\n        events.add(event);\n    }\n\n    public List\u003CString> getEvents()\n    {\n        return List.copyOf(events);\n    }\n\n    public int getMatchNumber()\n    {\n        return matchNumber;\n    }\n}\n",[1092,2265,2266,2271,2276,2280,2285,2289,2294,2298,2303,2308,2313,2317,2322,2328,2333,2339,2344,2350,2355,2361,2366,2372,2377,2382,2387,2392,2398,2403,2409,2415,2420,2426,2431,2437,2442,2447,2453,2458,2464,2469,2474,2480,2485,2491,2496,2501,2507,2512,2518,2523],{"__ignoreMap":1106},[1110,2267,2268],{"class":1112,"line":1113},[1110,2269,2270],{},"import java.util.ArrayList;\n",[1110,2272,2273],{"class":1112,"line":1119},[1110,2274,2275],{},"import java.util.List;\n",[1110,2277,2278],{"class":1112,"line":1125},[1110,2279,1342],{"emptyLinePlaceholder":1341},[1110,2281,2282],{"class":1112,"line":1131},[1110,2283,2284],{},"public class MatchLogCheck\n",[1110,2286,2287],{"class":1112,"line":1137},[1110,2288,1122],{},[1110,2290,2291],{"class":1112,"line":1143},[1110,2292,2293],{},"    public static void main(String[] args)\n",[1110,2295,2296],{"class":1112,"line":1149},[1110,2297,1352],{},[1110,2299,2300],{"class":1112,"line":1360},[1110,2301,2302],{},"        MatchLog log = new MatchLog(42);\n",[1110,2304,2305],{"class":1112,"line":1366},[1110,2306,2307],{},"        log.record(\"Auto: scored 2 notes\");\n",[1110,2309,2310],{"class":1112,"line":1439},[1110,2311,2312],{},"        log.record(\"Teleop: climbed\");\n",[1110,2314,2315],{"class":1112,"line":1445},[1110,2316,1342],{"emptyLinePlaceholder":1341},[1110,2318,2319],{"class":1112,"line":1451},[1110,2320,2321],{},"        List\u003CString> events = log.getEvents();\n",[1110,2323,2325],{"class":1112,"line":2324},13,[1110,2326,2327],{},"        System.out.println(\"Match \" + log.getMatchNumber() + \": \" + events);\n",[1110,2329,2331],{"class":1112,"line":2330},14,[1110,2332,1342],{"emptyLinePlaceholder":1341},[1110,2334,2336],{"class":1112,"line":2335},15,[1110,2337,2338],{},"        try\n",[1110,2340,2342],{"class":1112,"line":2341},16,[1110,2343,1731],{},[1110,2345,2347],{"class":1112,"line":2346},17,[1110,2348,2349],{},"            events.add(\"Hacked entry\");\n",[1110,2351,2353],{"class":1112,"line":2352},18,[1110,2354,1741],{},[1110,2356,2358],{"class":1112,"line":2357},19,[1110,2359,2360],{},"        catch (UnsupportedOperationException e)\n",[1110,2362,2364],{"class":1112,"line":2363},20,[1110,2365,1731],{},[1110,2367,2369],{"class":1112,"line":2368},21,[1110,2370,2371],{},"            System.out.println(\"getEvents() is safe: \" + e.getClass().getSimpleName());\n",[1110,2373,2375],{"class":1112,"line":2374},22,[1110,2376,1741],{},[1110,2378,2380],{"class":1112,"line":2379},23,[1110,2381,1363],{},[1110,2383,2385],{"class":1112,"line":2384},24,[1110,2386,1152],{},[1110,2388,2390],{"class":1112,"line":2389},25,[1110,2391,1342],{"emptyLinePlaceholder":1341},[1110,2393,2395],{"class":1112,"line":2394},26,[1110,2396,2397],{},"class MatchLog\n",[1110,2399,2401],{"class":1112,"line":2400},27,[1110,2402,1122],{},[1110,2404,2406],{"class":1112,"line":2405},28,[1110,2407,2408],{},"    private final int matchNumber;\n",[1110,2410,2412],{"class":1112,"line":2411},29,[1110,2413,2414],{},"    private final ArrayList\u003CString> events = new ArrayList\u003CString>();\n",[1110,2416,2418],{"class":1112,"line":2417},30,[1110,2419,1342],{"emptyLinePlaceholder":1341},[1110,2421,2423],{"class":1112,"line":2422},31,[1110,2424,2425],{},"    public MatchLog(int matchNumber)\n",[1110,2427,2429],{"class":1112,"line":2428},32,[1110,2430,1352],{},[1110,2432,2434],{"class":1112,"line":2433},33,[1110,2435,2436],{},"        this.matchNumber = matchNumber;\n",[1110,2438,2440],{"class":1112,"line":2439},34,[1110,2441,1363],{},[1110,2443,2445],{"class":1112,"line":2444},35,[1110,2446,1342],{"emptyLinePlaceholder":1341},[1110,2448,2450],{"class":1112,"line":2449},36,[1110,2451,2452],{},"    public void record(String event)\n",[1110,2454,2456],{"class":1112,"line":2455},37,[1110,2457,1352],{},[1110,2459,2461],{"class":1112,"line":2460},38,[1110,2462,2463],{},"        events.add(event);\n",[1110,2465,2467],{"class":1112,"line":2466},39,[1110,2468,1363],{},[1110,2470,2472],{"class":1112,"line":2471},40,[1110,2473,1342],{"emptyLinePlaceholder":1341},[1110,2475,2477],{"class":1112,"line":2476},41,[1110,2478,2479],{},"    public List\u003CString> getEvents()\n",[1110,2481,2483],{"class":1112,"line":2482},42,[1110,2484,1352],{},[1110,2486,2488],{"class":1112,"line":2487},43,[1110,2489,2490],{},"        return List.copyOf(events);\n",[1110,2492,2494],{"class":1112,"line":2493},44,[1110,2495,1363],{},[1110,2497,2499],{"class":1112,"line":2498},45,[1110,2500,1342],{"emptyLinePlaceholder":1341},[1110,2502,2504],{"class":1112,"line":2503},46,[1110,2505,2506],{},"    public int getMatchNumber()\n",[1110,2508,2510],{"class":1112,"line":2509},47,[1110,2511,1352],{},[1110,2513,2515],{"class":1112,"line":2514},48,[1110,2516,2517],{},"        return matchNumber;\n",[1110,2519,2521],{"class":1112,"line":2520},49,[1110,2522,1363],{},[1110,2524,2526],{"class":1112,"line":2525},50,[1110,2527,1152],{},[1084,2529,2531],{"id":2530},"what-it-prints","What It Prints",[1101,2533,2538],{"className":2534,"code":2536,"language":2537},[2535],"language-text","Match 42: [Auto: scored 2 notes, Teleop: climbed]\ngetEvents() is safe: UnsupportedOperationException\n","text",[1092,2539,2536],{"__ignoreMap":1106},[1080,2541,2542,2543,2545,2546,2548,2549,2551],{},"The dashboard's copy of ",[1092,2544,2050],{}," prints the two recorded strings. Trying to add to that copy throws instead of silently succeeding, because ",[1092,2547,1686],{}," returns an unmodifiable list — proof that this copy really is separate from ",[1092,2550,2024],{},"'s own data.",[1084,2553,2555],{"id":2554},"what-the-leaky-version-would-let-happen","What the Leaky Version Would Let Happen",[1080,2557,2558,2559,2561,2562,2564],{},"If ",[1092,2560,2070],{}," returned ",[1092,2563,2050],{}," directly instead of a copy:",[1101,2566,2568],{"className":1103,"code":2567,"language":1105,"meta":1106,"style":1106},"public ArrayList\u003CString> getEvents()\n{\n    return events; \u002F\u002F leak — hands back the real list\n}\n",[1092,2569,2570,2575,2579,2584],{"__ignoreMap":1106},[1110,2571,2572],{"class":1112,"line":1113},[1110,2573,2574],{},"public ArrayList\u003CString> getEvents()\n",[1110,2576,2577],{"class":1112,"line":1119},[1110,2578,1122],{},[1110,2580,2581],{"class":1112,"line":1125},[1110,2582,2583],{},"    return events; \u002F\u002F leak — hands back the real list\n",[1110,2585,2586],{"class":1112,"line":1131},[1110,2587,1152],{},[1080,2589,2590,2591,2594,2595,1868,2598,2600,2601,2603,2604,2606,2607,2609,2610,2612,2613,2615],{},"then ",[1092,2592,2593],{},"log.getEvents().clear();",", called from ",[1218,2596,2597],{},"outside",[1092,2599,2024],{},", would silently wipe out the match's real event list — no exception, no warning, and none of ",[1092,2602,2024],{},"'s own methods would ever run. ",[1092,2605,1098],{}," never stopped that: ",[1092,2608,2050],{}," was ",[1092,2611,1098],{}," in both versions. Only the defensive copy in ",[1092,2614,2070],{}," actually prevents it.",[1084,2617,2619],{"id":2618},"what-breaking-each-rule-would-look-like","What Breaking Each Rule Would Look Like",[1080,2621,2622],{},"Each of these edits fails to compile, and each failure matches one rule from the lesson:",[1822,2624,2625,2638,2654],{},[1825,2626,2627,2630,2631,2634,2635,2637],{},[1271,2628,2629],{},"Leaving the blank final field unassigned."," Adding a second constructor, ",[1092,2632,2633],{},"public MatchLog() { }",", gives ",[1092,2636,2121],{}," — that path never assigns it.",[1825,2639,2640,2643,2644,2646,2647,2650,2651,1521],{},[1271,2641,2642],{},"Reassigning a final field after construction."," Replacing ",[1092,2645,1697],{},"'s body with ",[1092,2648,2649],{},"matchNumber = 7; events.add(event);"," gives ",[1092,2652,2653],{},"cannot assign a value to final variable matchNumber",[1825,2655,2656,2643,2659,2646,2661,2650,2664,2667,2668,2670],{},[1271,2657,2658],{},"Reassigning a final reference to a new object.",[1092,2660,1697],{},[1092,2662,2663],{},"events = new ArrayList\u003CString>();",[1092,2665,2666],{},"cannot assign a value to final variable events",". Adding to the list was fine; pointing ",[1092,2669,2050],{}," at a different list isn't.",[1084,2672,2674],{"id":2673},"recap","Recap",[1822,2676,2677,2685,2697,2708],{},[1825,2678,2679,2681,2682,2684],{},[1092,2680,2041],{}," is a blank ",[1092,2683,1261],{}," field: no initializer at its declaration, assigned exactly once, in the constructor — the blank final rule.",[1825,2686,2687,2689,2690,2693,2694,2696],{},[1092,2688,2050],{}," is a ",[1092,2691,2692],{},"private final ArrayList",", only ever appended to through ",[1092,2695,2061],{},", never reassigned to a different list.",[1825,2698,2699,2701,2702,2704,2705,2707],{},[1092,2700,2070],{}," returns ",[1092,2703,2225],{},", a defensive copy, instead of the real list — the caller can read it, but can't mutate ",[1092,2706,2024],{},"'s actual data or even modify the copy at all.",[1825,2709,2710,2712],{},[1092,2711,1098],{}," alone doesn't stop a mutable field from leaking — only returning a defensive copy (instead of the field itself) does.",[1989,2714,1991],{},{"title":1106,"searchDepth":1119,"depth":1119,"links":2716},[2717,2718,2719,2720,2721,2722,2723,2724,2725,2726],{"id":2017,"depth":1119,"text":2018},{"id":2031,"depth":1119,"text":2032},{"id":2080,"depth":1119,"text":2081},{"id":2124,"depth":1119,"text":2125},{"id":2175,"depth":1119,"text":2176},{"id":2229,"depth":1119,"text":2230},{"id":2530,"depth":1119,"text":2531},{"id":2554,"depth":1119,"text":2555},{"id":2618,"depth":1119,"text":2619},{"id":2673,"depth":1119,"text":2674},{"outlineRef":2004,"pairsWith":2728,"status":2729},"[`lessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access.md`](..\u002F..\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":695,"description":1106},"PIjQDLfhVDgn7ZVZFJGUw3W0o17byx2YzBuGccP7TFY",{"id":2733,"title":1008,"body":2734,"description":1106,"extension":2002,"meta":3978,"navigation":1341,"path":1007,"seo":3980,"stem":1009,"__hash__":3981},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access.md",{"type":1073,"value":2735,"toc":3973},[2736,2739,2743,2753,2762,2768,2773,2799,2805,2824,2857,2861,2883,2886,2961,2966,2972,3035,3132,3136,3142,3147,3154,3197,3230,3235,3240,3456,3461,3466,3472,3477,3483,3488,3492,3498,3502,3508,3513,3517,3523,3527,3533,3538,3542,3548,3552,3558,3563,3567,3573,3577,3583,3588,3592,3598,3602,3608,3613,3919,3971],[1076,2737,1008],{"id":2738},"access-final-and-immutability-exercises",[1084,2740,2742],{"id":2741},"multiple-choice","Multiple Choice",[1080,2744,2745,2748,2749,2752],{},[1271,2746,2747],{},"Question:"," A ",[1092,2750,2751],{},"FaultLog"," class has this field:",[1101,2754,2756],{"className":1103,"code":2755,"language":1105,"meta":1106,"style":1106},"private final ArrayList\u003CString> faults = new ArrayList\u003CString>();\n",[1092,2757,2758],{"__ignoreMap":1106},[1110,2759,2760],{"class":1112,"line":1113},[1110,2761,2755],{},[1080,2763,2764,2765,2767],{},"Which one of these lines, written inside one of ",[1092,2766,2751],{},"'s own methods, fails to compile?",[1080,2769,2770],{},[1271,2771,2772],{},"Options:",[1822,2774,2775,2781,2787,2793],{},[1825,2776,2777,2778],{},"A. ",[1092,2779,2780],{},"faults.add(\"CAN timeout\");",[1825,2782,2783,2784],{},"B. ",[1092,2785,2786],{},"faults.remove(0);",[1825,2788,2789,2790],{},"C. ",[1092,2791,2792],{},"faults = new ArrayList\u003CString>();",[1825,2794,2795,2796],{},"D. ",[1092,2797,2798],{},"System.out.println(faults.size());",[1080,2800,2801,2804],{},[1271,2802,2803],{},"Answer:"," C",[1080,2806,2807,1868,2810,2812,2813,2816,2817,2819,2820,2823],{},[1271,2808,2809],{},"Why:",[1092,2811,1261],{}," allows a variable exactly one assignment, and ",[1092,2814,2815],{},"faults"," already got it in its declaration. Assigning it again, pointing it at a different list, is a compile error. On an object reference, ",[1092,2818,1261],{}," locks ",[1218,2821,2822],{},"which object"," the variable refers to, not what's inside that object.",[1822,2825,2826,2842,2848],{},[1825,2827,2828,2829,2832,2833,2835,2836,2838,2839,2841],{},"A is wrong. ",[1092,2830,2831],{},"add"," changes the contents of the list ",[1092,2834,2815],{}," refers to. It doesn't reassign ",[1092,2837,2815],{},", so ",[1092,2840,1261],{}," doesn't block it.",[1825,2843,2844,2845,2847],{},"B is wrong. Removing an element also only changes the list's contents. ",[1092,2846,2815],{}," still refers to the same list afterward.",[1825,2849,2850,2851,2853,2854,2856],{},"D is wrong. This only reads from the list. Reading a ",[1092,2852,1261],{}," variable is always allowed, and ",[1092,2855,1098],{}," doesn't stop it either, since this line is inside the class's own method.",[1084,2858,2860],{"id":2859},"micro-parsons","Micro-Parsons",[1080,2862,2863,2866,2867,2870,2871,2873,2874,2877,2878,2880,2881,1521],{},[1271,2864,2865],{},"Problem:"," These lines, once correctly ordered, form a complete program that builds an ",[1092,2868,2869],{},"AllianceInfo"," with a blank ",[1092,2872,1261],{}," field, set once in the constructor, and prints ",[1092,2875,2876],{},"Alliance: Red",". Keep the field, constructor, and ",[1092,2879,1982],{}," in the usual order a class is written in: the field first, then the constructor, then ",[1092,2882,1982],{},[1080,2884,2885],{},"Reorder the fragments below into a working program:",[1822,2887,2888,2894,2900,2906,2912,2918,2924,2930,2936,2942,2948,2953],{},[1825,2889,2890,2891],{},"a. ",[1092,2892,2893],{},"    private final String color;",[1825,2895,2896,2897],{},"b. ",[1092,2898,2899],{},"public class AllianceInfo",[1825,2901,2902,2903],{},"c. ",[1092,2904,2905],{},"    public AllianceInfo(String color)",[1825,2907,2908,2909],{},"d. ",[1092,2910,2911],{},"{",[1825,2913,2914,2915],{},"e. ",[1092,2916,2917],{},"        this.color = color;",[1825,2919,2920,2921],{},"f. ",[1092,2922,2923],{},"    {",[1825,2925,2926,2927],{},"g. ",[1092,2928,2929],{},"    public static void main(String[] args)",[1825,2931,2932,2933],{},"h. ",[1092,2934,2935],{},"        AllianceInfo info = new AllianceInfo(\"Red\");",[1825,2937,2938,2939],{},"i. ",[1092,2940,2941],{},"        System.out.println(\"Alliance: \" + info.color);",[1825,2943,2944,2945],{},"j. ",[1092,2946,2947],{},"    }",[1825,2949,2950,2951],{},"k. ",[1092,2952,2923],{},[1825,2954,2955,2956,1868,2958],{},"l. ",[1092,2957,2947],{},[1092,2959,2960],{},"}",[1080,2962,2963,2965],{},[1271,2964,2803],{}," b, d, a, c, f, e, j, g, k, h, i, l",[1080,2967,2968,2971],{},[1271,2969,2970],{},"Interchangeable:"," (f, k)",[1101,2973,2975],{"className":1103,"code":2974,"language":1105,"meta":1106,"style":1106},"public class AllianceInfo\n{\n    private final String color;\n    public AllianceInfo(String color)\n    {\n        this.color = color;\n    }\n    public static void main(String[] args)\n    {\n        AllianceInfo info = new AllianceInfo(\"Red\");\n        System.out.println(\"Alliance: \" + info.color);\n    }\n}\n",[1092,2976,2977,2982,2986,2991,2996,3000,3005,3009,3013,3017,3022,3027,3031],{"__ignoreMap":1106},[1110,2978,2979],{"class":1112,"line":1113},[1110,2980,2981],{},"public class AllianceInfo\n",[1110,2983,2984],{"class":1112,"line":1119},[1110,2985,1122],{},[1110,2987,2988],{"class":1112,"line":1125},[1110,2989,2990],{},"    private final String color;\n",[1110,2992,2993],{"class":1112,"line":1131},[1110,2994,2995],{},"    public AllianceInfo(String color)\n",[1110,2997,2998],{"class":1112,"line":1137},[1110,2999,1352],{},[1110,3001,3002],{"class":1112,"line":1143},[1110,3003,3004],{},"        this.color = color;\n",[1110,3006,3007],{"class":1112,"line":1149},[1110,3008,1363],{},[1110,3010,3011],{"class":1112,"line":1360},[1110,3012,2293],{},[1110,3014,3015],{"class":1112,"line":1366},[1110,3016,1352],{},[1110,3018,3019],{"class":1112,"line":1439},[1110,3020,3021],{},"        AllianceInfo info = new AllianceInfo(\"Red\");\n",[1110,3023,3024],{"class":1112,"line":1445},[1110,3025,3026],{},"        System.out.println(\"Alliance: \" + info.color);\n",[1110,3028,3029],{"class":1112,"line":1451},[1110,3030,1363],{},[1110,3032,3033],{"class":1112,"line":2324},[1110,3034,1152],{},[1080,3036,3037,3040,3041,3044,3045,3048,3049,1976,3052,3055,3056,3058,3059,3062,3063,3066,3067,3070,3071,3074,3075,3077,3078,3062,3081,3084,3085,1095,3087,3089,3090,3092,3093,3095,3096,1540,3098,3101,3102,3105,3106,3109,3110,3113,3114,3116,3117,3119,3120,1613,3122,3124,3125,3128,3129,3131],{},[1271,3038,3039],{},"Why this order:"," The class line (",[1092,3042,3043],{},"b",") and its opening brace (",[1092,3046,3047],{},"d",") come first. ",[1092,3050,3051],{},"color",[1092,3053,3054],{},"a",") is declared with no initializer — legal for a ",[1092,3057,1261],{}," field, as long as every constructor assigns it exactly once — so it's declared before the constructor that gives it its one assignment. The constructor's signature (",[1092,3060,3061],{},"c",") and opening brace (",[1092,3064,3065],{},"f",") come next, then the assignment (",[1092,3068,3069],{},"e",") and its closing brace (",[1092,3072,3073],{},"j","). ",[1092,3076,1982],{},"'s signature (",[1092,3079,3080],{},"g",[1092,3082,3083],{},"k",") follow the constructor — ",[1092,3086,3065],{},[1092,3088,3083],{}," are both the identical text ",[1092,3091,2923],{},", so which specific one lands on which brace makes no visible difference (hence ",[1271,3094,2970],{}," (f, k)). Inside ",[1092,3097,1982],{},[1092,3099,3100],{},"info"," has to be created (",[1092,3103,3104],{},"h",") before its field can be read (",[1092,3107,3108],{},"i",") — ",[1092,3111,3112],{},"info.color"," is legal here because ",[1092,3115,1982],{}," is inside ",[1092,3118,2869],{}," itself, the same class ",[1092,3121,3051],{},[1092,3123,1098],{}," to. The last fragment (",[1092,3126,3127],{},"l",") closes ",[1092,3130,1982],{}," and then the class, merged into one fragment since nothing else can come between them.",[1084,3133,3135],{"id":3134},"coding","Coding",[1080,3137,3138,3141],{},[1271,3139,3140],{},"Mode:"," full-program",[1080,3143,3144,3146],{},[1271,3145,2865],{}," Write two immutable types.",[1080,3148,3149,3153],{},[1271,3150,3151],{},[1092,3152,1621],{}," keeps a list of note strings safely:",[1822,3155,3156,3163,3177],{},[1825,3157,3158,3159,3162],{},"It has a ",[1092,3160,3161],{},"private final List\u003CString>"," field.",[1825,3164,3165,3166,3169,3170,3172,3173,3176],{},"Its constructor ",[1092,3167,3168],{},"PitNotes(List\u003CString> initial)"," stores a ",[1271,3171,1648],{}," of ",[1092,3174,3175],{},"initial",", so later changes to the caller's list don't reach the notes.",[1825,3178,3179,3182,3183,3186,3187,3189,3190,3192,3193,3196],{},[1092,3180,3181],{},"List\u003CString> getNotes()"," returns a ",[1271,3184,3185],{},"defensive, unmodifiable copy",", so the caller can't change ",[1092,3188,1621],{},"'s data through the returned list\n(trying to ",[1092,3191,2831],{}," to it must throw ",[1092,3194,3195],{},"UnsupportedOperationException",").",[1080,3198,3199,2689,3204,3206,3207,1095,3210,3213,3214,3217,3218,3221,3222,3225,3226,3229],{},[1271,3200,3201],{},[1092,3202,3203],{},"Reading",[1092,3205,1697],{}," with two components, ",[1092,3208,3209],{},"double volts",[1092,3211,3212],{},"double timestampSeconds",". A compact constructor rejects negative ",[1092,3215,3216],{},"volts","\nby throwing ",[1092,3219,3220],{},"IllegalArgumentException"," with the message ",[1092,3223,3224],{},"volts can't be negative","; ",[1092,3227,3228],{},"0"," volts is allowed.",[1080,3231,3232,3234],{},[1092,3233,1982],{}," reads a count, that many note words, then a voltage and a timestamp.",[1080,3236,3237],{},[1271,3238,3239],{},"Starter:",[1101,3241,3243],{"className":1103,"code":3242,"language":1105,"meta":1106,"style":1106},"import java.util.ArrayList;\nimport java.util.List;\nimport java.util.Scanner;\n\npublic class Main\n{\n    public static void main(String[] args) \u002F\u002F Don't change main\n    {\n        Scanner in = new Scanner(System.in);\n        int count = in.nextInt();\n        List\u003CString> initial = new ArrayList\u003C>();\n        for (int i = 0; i \u003C count; i++)\n        {\n            initial.add(in.next());\n        }\n        PitNotes notes = new PitNotes(initial);\n        initial.add(\"late-edit\"); \u002F\u002F changing the caller's own list must not change the notes\n\n        List\u003CString> view = notes.getNotes();\n        try\n        {\n            view.add(\"hacked\");\n            System.out.println(\"getNotes() can be modified\");\n        }\n        catch (UnsupportedOperationException e)\n        {\n            System.out.println(\"getNotes() is read-only\");\n        }\n        System.out.println(\"Notes: \" + notes.getNotes());\n\n        double volts = in.nextDouble();\n        double seconds = in.nextDouble();\n        try\n        {\n            Reading reading = new Reading(volts, seconds);\n            System.out.println(reading);\n        }\n        catch (IllegalArgumentException e)\n        {\n            System.out.println(\"Rejected: \" + e.getMessage());\n        }\n    }\n}\n\n\u002F\u002F TODO: write the class PitNotes\n\n\u002F\u002F TODO: write the record Reading\n",[1092,3244,3245,3249,3253,3258,3262,3267,3271,3276,3280,3285,3290,3295,3300,3304,3309,3313,3318,3323,3327,3332,3336,3340,3345,3350,3354,3358,3362,3367,3371,3376,3380,3385,3390,3394,3398,3403,3408,3412,3417,3421,3426,3430,3434,3438,3442,3447,3451],{"__ignoreMap":1106},[1110,3246,3247],{"class":1112,"line":1113},[1110,3248,2270],{},[1110,3250,3251],{"class":1112,"line":1119},[1110,3252,2275],{},[1110,3254,3255],{"class":1112,"line":1125},[1110,3256,3257],{},"import java.util.Scanner;\n",[1110,3259,3260],{"class":1112,"line":1131},[1110,3261,1342],{"emptyLinePlaceholder":1341},[1110,3263,3264],{"class":1112,"line":1137},[1110,3265,3266],{},"public class Main\n",[1110,3268,3269],{"class":1112,"line":1143},[1110,3270,1122],{},[1110,3272,3273],{"class":1112,"line":1149},[1110,3274,3275],{},"    public static void main(String[] args) \u002F\u002F Don't change main\n",[1110,3277,3278],{"class":1112,"line":1360},[1110,3279,1352],{},[1110,3281,3282],{"class":1112,"line":1366},[1110,3283,3284],{},"        Scanner in = new Scanner(System.in);\n",[1110,3286,3287],{"class":1112,"line":1439},[1110,3288,3289],{},"        int count = in.nextInt();\n",[1110,3291,3292],{"class":1112,"line":1445},[1110,3293,3294],{},"        List\u003CString> initial = new ArrayList\u003C>();\n",[1110,3296,3297],{"class":1112,"line":1451},[1110,3298,3299],{},"        for (int i = 0; i \u003C count; i++)\n",[1110,3301,3302],{"class":1112,"line":2324},[1110,3303,1731],{},[1110,3305,3306],{"class":1112,"line":2330},[1110,3307,3308],{},"            initial.add(in.next());\n",[1110,3310,3311],{"class":1112,"line":2335},[1110,3312,1741],{},[1110,3314,3315],{"class":1112,"line":2341},[1110,3316,3317],{},"        PitNotes notes = new PitNotes(initial);\n",[1110,3319,3320],{"class":1112,"line":2346},[1110,3321,3322],{},"        initial.add(\"late-edit\"); \u002F\u002F changing the caller's own list must not change the notes\n",[1110,3324,3325],{"class":1112,"line":2352},[1110,3326,1342],{"emptyLinePlaceholder":1341},[1110,3328,3329],{"class":1112,"line":2357},[1110,3330,3331],{},"        List\u003CString> view = notes.getNotes();\n",[1110,3333,3334],{"class":1112,"line":2363},[1110,3335,2338],{},[1110,3337,3338],{"class":1112,"line":2368},[1110,3339,1731],{},[1110,3341,3342],{"class":1112,"line":2374},[1110,3343,3344],{},"            view.add(\"hacked\");\n",[1110,3346,3347],{"class":1112,"line":2379},[1110,3348,3349],{},"            System.out.println(\"getNotes() can be modified\");\n",[1110,3351,3352],{"class":1112,"line":2384},[1110,3353,1741],{},[1110,3355,3356],{"class":1112,"line":2389},[1110,3357,2360],{},[1110,3359,3360],{"class":1112,"line":2394},[1110,3361,1731],{},[1110,3363,3364],{"class":1112,"line":2400},[1110,3365,3366],{},"            System.out.println(\"getNotes() is read-only\");\n",[1110,3368,3369],{"class":1112,"line":2405},[1110,3370,1741],{},[1110,3372,3373],{"class":1112,"line":2411},[1110,3374,3375],{},"        System.out.println(\"Notes: \" + notes.getNotes());\n",[1110,3377,3378],{"class":1112,"line":2417},[1110,3379,1342],{"emptyLinePlaceholder":1341},[1110,3381,3382],{"class":1112,"line":2422},[1110,3383,3384],{},"        double volts = in.nextDouble();\n",[1110,3386,3387],{"class":1112,"line":2428},[1110,3388,3389],{},"        double seconds = in.nextDouble();\n",[1110,3391,3392],{"class":1112,"line":2433},[1110,3393,2338],{},[1110,3395,3396],{"class":1112,"line":2439},[1110,3397,1731],{},[1110,3399,3400],{"class":1112,"line":2444},[1110,3401,3402],{},"            Reading reading = new Reading(volts, seconds);\n",[1110,3404,3405],{"class":1112,"line":2449},[1110,3406,3407],{},"            System.out.println(reading);\n",[1110,3409,3410],{"class":1112,"line":2455},[1110,3411,1741],{},[1110,3413,3414],{"class":1112,"line":2460},[1110,3415,3416],{},"        catch (IllegalArgumentException e)\n",[1110,3418,3419],{"class":1112,"line":2466},[1110,3420,1731],{},[1110,3422,3423],{"class":1112,"line":2471},[1110,3424,3425],{},"            System.out.println(\"Rejected: \" + e.getMessage());\n",[1110,3427,3428],{"class":1112,"line":2476},[1110,3429,1741],{},[1110,3431,3432],{"class":1112,"line":2482},[1110,3433,1363],{},[1110,3435,3436],{"class":1112,"line":2487},[1110,3437,1152],{},[1110,3439,3440],{"class":1112,"line":2493},[1110,3441,1342],{"emptyLinePlaceholder":1341},[1110,3443,3444],{"class":1112,"line":2498},[1110,3445,3446],{},"\u002F\u002F TODO: write the class PitNotes\n",[1110,3448,3449],{"class":1112,"line":2503},[1110,3450,1342],{"emptyLinePlaceholder":1341},[1110,3452,3453],{"class":1112,"line":2509},[1110,3454,3455],{},"\u002F\u002F TODO: write the record Reading\n",[1080,3457,3458],{},[1271,3459,3460],{},"Scenario 1 (visible):",[1080,3462,3463],{},[1271,3464,3465],{},"Input:",[1101,3467,3470],{"className":3468,"code":3469,"language":2537,"meta":1106},[2535],"2\nchain grease\n12.6 41.2\n",[1092,3471,3469],{"__ignoreMap":1106},[1080,3473,3474],{},[1271,3475,3476],{},"Expected output:",[1101,3478,3481],{"className":3479,"code":3480,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: [chain, grease]\nReading[volts=12.6, timestampSeconds=41.2]\n",[1092,3482,3480],{"__ignoreMap":1106},[1080,3484,3485],{},[1271,3486,3487],{},"Scenario 2 (visible):",[1080,3489,3490],{},[1271,3491,3465],{},[1101,3493,3496],{"className":3494,"code":3495,"language":2537,"meta":1106},[2535],"0\n3.3 0.5\n",[1092,3497,3495],{"__ignoreMap":1106},[1080,3499,3500],{},[1271,3501,3476],{},[1101,3503,3506],{"className":3504,"code":3505,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: []\nReading[volts=3.3, timestampSeconds=0.5]\n",[1092,3507,3505],{"__ignoreMap":1106},[1080,3509,3510],{},[1271,3511,3512],{},"Scenario 3 (visible):",[1080,3514,3515],{},[1271,3516,3465],{},[1101,3518,3521],{"className":3519,"code":3520,"language":2537,"meta":1106},[2535],"1\nbumper\n-0.1 9.0\n",[1092,3522,3520],{"__ignoreMap":1106},[1080,3524,3525],{},[1271,3526,3476],{},[1101,3528,3531],{"className":3529,"code":3530,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: [bumper]\nRejected: volts can't be negative\n",[1092,3532,3530],{"__ignoreMap":1106},[1080,3534,3535],{},[1271,3536,3537],{},"Scenario 4 (hidden):",[1080,3539,3540],{},[1271,3541,3465],{},[1101,3543,3546],{"className":3544,"code":3545,"language":2537,"meta":1106},[2535],"3\nA B C\n0.0 7.5\n",[1092,3547,3545],{"__ignoreMap":1106},[1080,3549,3550],{},[1271,3551,3476],{},[1101,3553,3556],{"className":3554,"code":3555,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: [A, B, C]\nReading[volts=0.0, timestampSeconds=7.5]\n",[1092,3557,3555],{"__ignoreMap":1106},[1080,3559,3560],{},[1271,3561,3562],{},"Scenario 5 (hidden):",[1080,3564,3565],{},[1271,3566,3465],{},[1101,3568,3571],{"className":3569,"code":3570,"language":2537,"meta":1106},[2535],"1\ntape\n-12.6 1.0\n",[1092,3572,3570],{"__ignoreMap":1106},[1080,3574,3575],{},[1271,3576,3476],{},[1101,3578,3581],{"className":3579,"code":3580,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: [tape]\nRejected: volts can't be negative\n",[1092,3582,3580],{"__ignoreMap":1106},[1080,3584,3585],{},[1271,3586,3587],{},"Scenario 6 (hidden):",[1080,3589,3590],{},[1271,3591,3465],{},[1101,3593,3596],{"className":3594,"code":3595,"language":2537,"meta":1106},[2535],"2\nswap battery\n13.2 100.0\n",[1092,3597,3595],{"__ignoreMap":1106},[1080,3599,3600],{},[1271,3601,3476],{},[1101,3603,3606],{"className":3604,"code":3605,"language":2537,"meta":1106},[2535],"getNotes() is read-only\nNotes: [swap, battery]\nReading[volts=13.2, timestampSeconds=100.0]\n",[1092,3607,3605],{"__ignoreMap":1106},[1080,3609,3610],{},[1271,3611,3612],{},"Solution:",[1101,3614,3616],{"className":1103,"code":3615,"language":1105,"meta":1106,"style":1106},"import java.util.ArrayList;\nimport java.util.List;\nimport java.util.Scanner;\n\npublic class Main\n{\n    public static void main(String[] args) \u002F\u002F Don't change main\n    {\n        Scanner in = new Scanner(System.in);\n        int count = in.nextInt();\n        List\u003CString> initial = new ArrayList\u003C>();\n        for (int i = 0; i \u003C count; i++)\n        {\n            initial.add(in.next());\n        }\n        PitNotes notes = new PitNotes(initial);\n        initial.add(\"late-edit\"); \u002F\u002F changing the caller's own list must not change the notes\n\n        List\u003CString> view = notes.getNotes();\n        try\n        {\n            view.add(\"hacked\");\n            System.out.println(\"getNotes() can be modified\");\n        }\n        catch (UnsupportedOperationException e)\n        {\n            System.out.println(\"getNotes() is read-only\");\n        }\n        System.out.println(\"Notes: \" + notes.getNotes());\n\n        double volts = in.nextDouble();\n        double seconds = in.nextDouble();\n        try\n        {\n            Reading reading = new Reading(volts, seconds);\n            System.out.println(reading);\n        }\n        catch (IllegalArgumentException e)\n        {\n            System.out.println(\"Rejected: \" + e.getMessage());\n        }\n    }\n}\n\nclass PitNotes\n{\n    private final List\u003CString> notes;\n\n    public PitNotes(List\u003CString> initial)\n    {\n        this.notes = new ArrayList\u003C>(initial);\n    }\n\n    public List\u003CString> getNotes()\n    {\n        return List.copyOf(notes);\n    }\n}\n\nrecord Reading(double volts, double timestampSeconds)\n{\n    public Reading\n    {\n        if (volts \u003C 0)\n        {\n            throw new IllegalArgumentException(\"volts can't be negative\");\n        }\n    }\n}\n",[1092,3617,3618,3622,3626,3630,3634,3638,3642,3646,3650,3654,3658,3662,3666,3670,3674,3678,3682,3686,3690,3694,3698,3702,3706,3710,3714,3718,3722,3726,3730,3734,3738,3742,3746,3750,3754,3758,3762,3766,3770,3774,3778,3782,3786,3790,3794,3798,3802,3807,3811,3816,3820,3826,3831,3836,3842,3847,3853,3858,3863,3868,3874,3879,3884,3889,3894,3899,3904,3909,3914],{"__ignoreMap":1106},[1110,3619,3620],{"class":1112,"line":1113},[1110,3621,2270],{},[1110,3623,3624],{"class":1112,"line":1119},[1110,3625,2275],{},[1110,3627,3628],{"class":1112,"line":1125},[1110,3629,3257],{},[1110,3631,3632],{"class":1112,"line":1131},[1110,3633,1342],{"emptyLinePlaceholder":1341},[1110,3635,3636],{"class":1112,"line":1137},[1110,3637,3266],{},[1110,3639,3640],{"class":1112,"line":1143},[1110,3641,1122],{},[1110,3643,3644],{"class":1112,"line":1149},[1110,3645,3275],{},[1110,3647,3648],{"class":1112,"line":1360},[1110,3649,1352],{},[1110,3651,3652],{"class":1112,"line":1366},[1110,3653,3284],{},[1110,3655,3656],{"class":1112,"line":1439},[1110,3657,3289],{},[1110,3659,3660],{"class":1112,"line":1445},[1110,3661,3294],{},[1110,3663,3664],{"class":1112,"line":1451},[1110,3665,3299],{},[1110,3667,3668],{"class":1112,"line":2324},[1110,3669,1731],{},[1110,3671,3672],{"class":1112,"line":2330},[1110,3673,3308],{},[1110,3675,3676],{"class":1112,"line":2335},[1110,3677,1741],{},[1110,3679,3680],{"class":1112,"line":2341},[1110,3681,3317],{},[1110,3683,3684],{"class":1112,"line":2346},[1110,3685,3322],{},[1110,3687,3688],{"class":1112,"line":2352},[1110,3689,1342],{"emptyLinePlaceholder":1341},[1110,3691,3692],{"class":1112,"line":2357},[1110,3693,3331],{},[1110,3695,3696],{"class":1112,"line":2363},[1110,3697,2338],{},[1110,3699,3700],{"class":1112,"line":2368},[1110,3701,1731],{},[1110,3703,3704],{"class":1112,"line":2374},[1110,3705,3344],{},[1110,3707,3708],{"class":1112,"line":2379},[1110,3709,3349],{},[1110,3711,3712],{"class":1112,"line":2384},[1110,3713,1741],{},[1110,3715,3716],{"class":1112,"line":2389},[1110,3717,2360],{},[1110,3719,3720],{"class":1112,"line":2394},[1110,3721,1731],{},[1110,3723,3724],{"class":1112,"line":2400},[1110,3725,3366],{},[1110,3727,3728],{"class":1112,"line":2405},[1110,3729,1741],{},[1110,3731,3732],{"class":1112,"line":2411},[1110,3733,3375],{},[1110,3735,3736],{"class":1112,"line":2417},[1110,3737,1342],{"emptyLinePlaceholder":1341},[1110,3739,3740],{"class":1112,"line":2422},[1110,3741,3384],{},[1110,3743,3744],{"class":1112,"line":2428},[1110,3745,3389],{},[1110,3747,3748],{"class":1112,"line":2433},[1110,3749,2338],{},[1110,3751,3752],{"class":1112,"line":2439},[1110,3753,1731],{},[1110,3755,3756],{"class":1112,"line":2444},[1110,3757,3402],{},[1110,3759,3760],{"class":1112,"line":2449},[1110,3761,3407],{},[1110,3763,3764],{"class":1112,"line":2455},[1110,3765,1741],{},[1110,3767,3768],{"class":1112,"line":2460},[1110,3769,3416],{},[1110,3771,3772],{"class":1112,"line":2466},[1110,3773,1731],{},[1110,3775,3776],{"class":1112,"line":2471},[1110,3777,3425],{},[1110,3779,3780],{"class":1112,"line":2476},[1110,3781,1741],{},[1110,3783,3784],{"class":1112,"line":2482},[1110,3785,1363],{},[1110,3787,3788],{"class":1112,"line":2487},[1110,3789,1152],{},[1110,3791,3792],{"class":1112,"line":2493},[1110,3793,1342],{"emptyLinePlaceholder":1341},[1110,3795,3796],{"class":1112,"line":2498},[1110,3797,1571],{},[1110,3799,3800],{"class":1112,"line":2503},[1110,3801,1122],{},[1110,3803,3804],{"class":1112,"line":2509},[1110,3805,3806],{},"    private final List\u003CString> notes;\n",[1110,3808,3809],{"class":1112,"line":2514},[1110,3810,1342],{"emptyLinePlaceholder":1341},[1110,3812,3813],{"class":1112,"line":2520},[1110,3814,3815],{},"    public PitNotes(List\u003CString> initial)\n",[1110,3817,3818],{"class":1112,"line":2525},[1110,3819,1352],{},[1110,3821,3823],{"class":1112,"line":3822},51,[1110,3824,3825],{},"        this.notes = new ArrayList\u003C>(initial);\n",[1110,3827,3829],{"class":1112,"line":3828},52,[1110,3830,1363],{},[1110,3832,3834],{"class":1112,"line":3833},53,[1110,3835,1342],{"emptyLinePlaceholder":1341},[1110,3837,3839],{"class":1112,"line":3838},54,[1110,3840,3841],{},"    public List\u003CString> getNotes()\n",[1110,3843,3845],{"class":1112,"line":3844},55,[1110,3846,1352],{},[1110,3848,3850],{"class":1112,"line":3849},56,[1110,3851,3852],{},"        return List.copyOf(notes);\n",[1110,3854,3856],{"class":1112,"line":3855},57,[1110,3857,1363],{},[1110,3859,3861],{"class":1112,"line":3860},58,[1110,3862,1152],{},[1110,3864,3866],{"class":1112,"line":3865},59,[1110,3867,1342],{"emptyLinePlaceholder":1341},[1110,3869,3871],{"class":1112,"line":3870},60,[1110,3872,3873],{},"record Reading(double volts, double timestampSeconds)\n",[1110,3875,3877],{"class":1112,"line":3876},61,[1110,3878,1122],{},[1110,3880,3882],{"class":1112,"line":3881},62,[1110,3883,1717],{},[1110,3885,3887],{"class":1112,"line":3886},63,[1110,3888,1352],{},[1110,3890,3892],{"class":1112,"line":3891},64,[1110,3893,1726],{},[1110,3895,3897],{"class":1112,"line":3896},65,[1110,3898,1731],{},[1110,3900,3902],{"class":1112,"line":3901},66,[1110,3903,1736],{},[1110,3905,3907],{"class":1112,"line":3906},67,[1110,3908,1741],{},[1110,3910,3912],{"class":1112,"line":3911},68,[1110,3913,1363],{},[1110,3915,3917],{"class":1112,"line":3916},69,[1110,3918,1152],{},[1080,3920,3921,1868,3923,3925,3926,3928,3929,3931,3932,3934,3935,3938,3939,3941,3942,3945,3946,3949,3950,3952,3953,3956,3957,3960,3961,3963,3964,3967,3968,1521],{},[1271,3922,2809],{},[1092,3924,1779],{}," only locks the ",[1092,3927,1612],{}," reference; it says nothing about what the list contains. The constructor copies ",[1218,3930,1842],{}," (otherwise ",[1092,3933,1982],{},"'s ",[1092,3936,3937],{},"initial.add(\"late-edit\")"," would sneak into the notes)\nand the getter copies ",[1218,3940,1846],{}," with ",[1092,3943,3944],{},"List.copyOf",", which is also unmodifiable, so ",[1092,3947,3948],{},"view.add(\"hacked\")"," throws. Returning ",[1092,3951,1612],{}," directly, or ",[1092,3954,3955],{},"new ArrayList\u003C>(notes)"," (a copy, but still modifiable),\nprints ",[1092,3958,3959],{},"getNotes() can be modified",". The ",[1092,3962,1697],{}," gives the private final fields, accessors, and the ",[1092,3965,3966],{},"Reading[volts=..., timestampSeconds=...]"," text for free; only the compact constructor's validation is yours,\nand the hidden scenarios check both the rejected negative and the allowed ",[1092,3969,3970],{},"0.0",[1989,3972,1991],{},{"title":1106,"searchDepth":1119,"depth":1119,"links":3974},[3975,3976,3977],{"id":2741,"depth":1119,"text":2742},{"id":2859,"depth":1119,"text":2860},{"id":3134,"depth":1119,"text":3135},{"outlineRef":2004,"pairsWith":2728,"status":3979},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":1008,"description":1106},"yGGbumQsPhbJMkLITiIVE1VIgWe-tGbeRe_lSD5ogO4",1792718166731]