Working with Abstraction Software University http://softuni.bg SoftUni Team Technical Trainers Architecture, Refactoring and Enumerations
Table of Contents 1. Project Architecture  Methods  Classes  Projects 2. Code Refactoring 3. Enumerations 4. Static Keyword 5. Java Packages 2
sli.do #java-advanced Have a Question?
Project Architecture Splitting Code into Logical Parts
 We use methods to split code into functional blocks  Improves code readability  Allows for easier debugging Splitting Code into Methods (1) 5 for (char move : moves){ for (int r = 0; r < room.length; r++) for (int c = 0; c < room[r].length; c++) if (room[row][col] == 'b') … } for (char move : moves) { moveEnemies(); killerCheck(); movePlayer(move); }
 Methods let us easily reuse code  We change the method once to affect all calls Splitting Code into Methods (2) 6 BankAccount bankAcc = new BankAccount(); bankAcc.setId(1); bankAcc.deposit(20); System.out.printf("Account %d, balance %d", bankAcc.getId(),bankAcc.getBalance()); bankAcc.withdraw(10); … System.out.println(bankAcc.ToString()); Override .toString() to set a global printing format
 A single method should complete a single task void withdraw ( … ) void deposit ( … ) BigDecimal getBalance ( … ) string toString ( … ) Splitting Code into Methods (3) 7 void doMagic ( … ) void depositOrWithdraw ( … ) BigDecimal depositAndGetBalance ( … ) String parseDataAndReturnResult ( … )
 Draw on the console a rhombus of stars with size n Problem: Rhombus of Stars 8 * * * * * * * * * n = 3 * * * * n = 2 * n = 1 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Rhombus of Stars (1) 9 int size = Integer.parseInt(sc.nextLine()); for (int starCount = 1; starCount <= size; starCount++) { printRow(size, starCount); } for (int starCount = size - 1; starCount >= 1; starCount--) { printRow(size, starCount); } Reusing code Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Rhombus of Stars (2) 10 static void printRow(int figureSize, int starCount) { for (int i = 0; i < figureSize - starCount; i++) System.out.print(" "); for (int col = 1; col < starCount; col++) { System.out.print("* "); } System.out.println("*"); } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Splitting Code into Classes (1)  Just like methods, classes should not know or do too much 11 GodMode master = new GodMode(); int[] numbers = master.parseAny(input); ... int[] numbers2 = master.copyAny(numbers); master.printToConsole(master.getDate()); master.printToConsole(numbers);
 We can also break our code up logically into classes  Hiding implementation  Allow us to change output destination  Helps us to avoid repeating code Splitting Code into Classes (2) 12
Splitting Code into Classes (3) 13 List<Integer> input = Arrays.stream( sc.nextLine().split(" ")) .map(Integer::parseInt) .collect(Collectors.toList()); ... String result = input.stream() .map(String::valueOf) .collect(Collectors.joining(", ")); System.out.println(result); ArrayParser parser = new ArrayParser(); OuputWriter printer = new OuputWriter(); int[] numbers = parser.integersParse(args); int[] coordinates = parser.integerParse(args1); printer.printToConsole(numbers);
 Create a Point class holding the horizontal and vertical coordinates  Create a Rectangle class  Holds 2 points  Bottom left and top right  Add Contains method  Takes a Point as an argument  Returns it if it’s inside the current object of the Rectangle class Problem: Point in Rectangle 14 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Point in Rectangle 15 public class Point { private int x; private int y; //TODO: Add getters and setters } public class Rectangle { private Point bottomLeft; private Point topRight; //TODO: getters and setters public boolean contains(Point point) { //TODO: Implement } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Point in Rectangle (2) 16 public boolean contains(Point point) { boolean isInHorizontal = this.bottomLeft.getX() <= point.getX() && this.topRight.getX() >= point.getX(); boolean isInVertical = this.bottomLeft.getY() <= point.getY() && this.topRight.getY() >= point.getY(); boolean isInRectangle = isInHorizontal && isInVertical; return isInRectangle; } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Refactoring Restructuring and Organizing Code
 Restructures code without changing the behaviour  Improves code readability  Reduces complexity Refactoring 18 class ProblemSolver { public static void doMagic() { … } } class CommandParser { public static <T> Function<T, T> parseCommand() { … } } class DataModifier { public static <T> T execute() { … } } class OutputFormatter { public static void print() { … } }
 Breaking code into reusable units  Extracting parts of methods and classes into new ones Refactoring Techniques 19 depositOrWithdraw()  Improving names of variables, methods, classes, etc. deposit() withdraw()  Moving methods or fields to more appropriate classes String str; String name; Car.open() Door.open()
 You are given a working Student System project to refactor  Break it up into smaller functional units and make sure it works  It supports the following commands:  "Create <studentName> <studentAge> <studentGrade>"  creates a new student  "Show <studentName>"  prints information about a student  "Exit"  closes the program Problem: Student System 20 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Enumerations Syntax and Usage
 Represent a numeric value from a fixed set as a text  We can use them to pass arguments to methods without making code confusing  By default enums start at 0  Every next value is incremented by 1 Enumerations 22 GetDailySchedule(0) GetDailySchedule(Day.Mon) enum Day {Mon, Tue, Wed, Thu, Fri, Sat, Sun}
 We can customize enum values Enumerations (1) 23 enum Day { Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sat(6),Sun(7); private int value; Day(int value) { this.value = value; } } System.out.println(Day.Sat); // Sat
 We can customize enum values Enumerations (2) 24 enum CoffeeSize { Small(100), Normal(150), Double(300); private int size; CoffeeSize(int size) { this.size = size; } public int getValue() { return this.size; } } System.out.println(CoffeeSize.Small.getValue()); // 100
 Create a class PriceCalculator that calculates the total price of a holiday, by given price per day, number of days, the season and a discount type  The discount type and season should be enums  The price multipliers will be:  1x for Autumn, 2x for Spring, etc.  The discount types will be:  None – 0%  SecondVisit – 10%  VIP – 20% Problem: Hotel Reservation 25Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Hotel Reservation (1) 26 public enum Season { Spring(2), Summer(4), Autumn(1), Winter(3); private int value; Season(int value) { this.value = value; } public int getValue(){ return this.value; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Hotel Reservation (2) 27 public enum Discount { None(0), SecondVisit(10), VIP(20); private int value; Discount(int value) { this.value = value; } public int getValue() { return this.value; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Solution: Hotel Reservation (3) 28 public class PriceCalculator { public static double CalculatePrice(double pricePerDay, int numberOfDays, Season season, Discount discount) { int multiplier = season.getValue(); double discountMultiplier = discount.getValue() / 100.0; double priceBeforeDiscount = numberOfDays * pricePerDay * multiplier; double discountedAmount = priceBeforeDiscount * discountMultiplier; return priceBeforeDiscount - discountedAmount; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
Static Keyword in Java Static Class, Variable, Method and Block 29
 Used for memory management mainly  Can apply with:  Nested class  Variables  Methods  Blocks  Belongs to the class than an instance of the class Static Keyword static int count; static void increaseCount() { count++; }
 A top level class is a class that is not a nested class  A nested class is any class whose declaration occurs within the body of another class or interface  Only nested classes can be static Static Class class TopClass { static class NestedStaticClass { } }
 Can be used to refer to the common variable of all objects  Еxample  The company name of employees  College name of students  Name of the college is common for all students  Allocate memory only once in class area at the time of class loading Static Variable
Example: Static Variable (1) 33 class Counter { int count = 0; static int staticCount = 0; public Counter() { count++; // incrementing value staticCount++; // incrementing value } public void printCounters() { System.out.printf("Count: %d%n", count); System.out.printf("Static Count: %d%n", staticCount); } }
Example: Static Variable (2) 34 // Inside the Main Class public static void main(String[] args) { Counter c1 = new Counter(); c1.printCounters(); Counter c2 = new Counter(); c2.printCounters(); Counter c3 = new Counter(); c3.printCounters(); int counter = Counter.staticCount; // 3 } Count: 1 Static Count: 1 Count: 1 Static Count: 2 Count: 1 Static Count: 3
 Belongs to the class rather than the object of a class  Can be invoked without the need for creating an instance of a class  Can access static data member and can change the value of it  Can not use non-static data member or call non-static method directly  this and super cannot be used in static context Static Method 35
class Calculate { static int cube(int x) { return x * x * x; } public static void main(String args[]) { int result = Calculate.cube(5); System.out.println(result); // 125 System.out.println(Math.pow(2, 3)); // 8.0 } } Example: Static Method 36
 A set of statements, which will be executed by the JVM before execution of main method  Executing static block is at the time of class loading  A class can take any number of static block but all blocks will be executed from top to bottom Static Block 37
class Main { static int n; public static void main(String[] args) { System.out.println("From main"); System.out.println(n); } static { System.out.println("From static block"); n = 10; } } Example: Static Block 38 From static block From main 10
Packages Built-In and User-Defined Packages 39
 Used to group related classes  Like a folder in a file directory  Use packages to avoid name conflicts and to write a better maintainable code  Packages are divided into two categories:  Built-in Packages (packages from the Java API)  User-defined Packages (create own packages) Packages in Java
 The library is divided into packages and classes  Import a single class or a whole package that contain all the classes  To use a class or a package, use the import keyword  The complete list can be found at Oracles website: https://docs.oracle.com/en/java/javase/ Build-In Packages 41 import package.name.Class; // Import a single class import package.name.*; // Import the whole package
 …  …  … Summary 42  Well organized code is easier to work with  We can reduce complexity using Methods, Classes and Projects  We can refactor existing code by breaking code down  Enumerations define a fixed set of constants  Represent numeric values  We can easily cast enums to numeric types  Static members and Packages
 https://softuni.bg/modules/59/java-advanced
SoftUni Diamond Partners
SoftUni Organizational Partners
 Software University – High-Quality Education and Employment Opportunities  softuni.bg  Software University Foundation  http://softuni.foundation/  Software University @ Facebook  facebook.com/SoftwareUniversity  Software University Forums  forum.softuni.bg Trainings @ Software University (SoftUni)
 This course (slides, examples, demos, videos, homework, etc.) is licensed under the "Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International" license License 47

20.1 Java working with abstraction

  • 1.
    Working with Abstraction SoftwareUniversity http://softuni.bg SoftUni Team Technical Trainers Architecture, Refactoring and Enumerations
  • 2.
    Table of Contents 1.Project Architecture  Methods  Classes  Projects 2. Code Refactoring 3. Enumerations 4. Static Keyword 5. Java Packages 2
  • 3.
  • 4.
  • 5.
     We usemethods to split code into functional blocks  Improves code readability  Allows for easier debugging Splitting Code into Methods (1) 5 for (char move : moves){ for (int r = 0; r < room.length; r++) for (int c = 0; c < room[r].length; c++) if (room[row][col] == 'b') … } for (char move : moves) { moveEnemies(); killerCheck(); movePlayer(move); }
  • 6.
     Methods letus easily reuse code  We change the method once to affect all calls Splitting Code into Methods (2) 6 BankAccount bankAcc = new BankAccount(); bankAcc.setId(1); bankAcc.deposit(20); System.out.printf("Account %d, balance %d", bankAcc.getId(),bankAcc.getBalance()); bankAcc.withdraw(10); … System.out.println(bankAcc.ToString()); Override .toString() to set a global printing format
  • 7.
     A singlemethod should complete a single task void withdraw ( … ) void deposit ( … ) BigDecimal getBalance ( … ) string toString ( … ) Splitting Code into Methods (3) 7 void doMagic ( … ) void depositOrWithdraw ( … ) BigDecimal depositAndGetBalance ( … ) String parseDataAndReturnResult ( … )
  • 8.
     Draw onthe console a rhombus of stars with size n Problem: Rhombus of Stars 8 * * * * * * * * * n = 3 * * * * n = 2 * n = 1 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 9.
    Solution: Rhombus ofStars (1) 9 int size = Integer.parseInt(sc.nextLine()); for (int starCount = 1; starCount <= size; starCount++) { printRow(size, starCount); } for (int starCount = size - 1; starCount >= 1; starCount--) { printRow(size, starCount); } Reusing code Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 10.
    Solution: Rhombus ofStars (2) 10 static void printRow(int figureSize, int starCount) { for (int i = 0; i < figureSize - starCount; i++) System.out.print(" "); for (int col = 1; col < starCount; col++) { System.out.print("* "); } System.out.println("*"); } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 11.
    Splitting Code intoClasses (1)  Just like methods, classes should not know or do too much 11 GodMode master = new GodMode(); int[] numbers = master.parseAny(input); ... int[] numbers2 = master.copyAny(numbers); master.printToConsole(master.getDate()); master.printToConsole(numbers);
  • 12.
     We canalso break our code up logically into classes  Hiding implementation  Allow us to change output destination  Helps us to avoid repeating code Splitting Code into Classes (2) 12
  • 13.
    Splitting Code intoClasses (3) 13 List<Integer> input = Arrays.stream( sc.nextLine().split(" ")) .map(Integer::parseInt) .collect(Collectors.toList()); ... String result = input.stream() .map(String::valueOf) .collect(Collectors.joining(", ")); System.out.println(result); ArrayParser parser = new ArrayParser(); OuputWriter printer = new OuputWriter(); int[] numbers = parser.integersParse(args); int[] coordinates = parser.integerParse(args1); printer.printToConsole(numbers);
  • 14.
     Create aPoint class holding the horizontal and vertical coordinates  Create a Rectangle class  Holds 2 points  Bottom left and top right  Add Contains method  Takes a Point as an argument  Returns it if it’s inside the current object of the Rectangle class Problem: Point in Rectangle 14 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 15.
    Solution: Point inRectangle 15 public class Point { private int x; private int y; //TODO: Add getters and setters } public class Rectangle { private Point bottomLeft; private Point topRight; //TODO: getters and setters public boolean contains(Point point) { //TODO: Implement } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 16.
    Solution: Point inRectangle (2) 16 public boolean contains(Point point) { boolean isInHorizontal = this.bottomLeft.getX() <= point.getX() && this.topRight.getX() >= point.getX(); boolean isInVertical = this.bottomLeft.getY() <= point.getY() && this.topRight.getY() >= point.getY(); boolean isInRectangle = isInHorizontal && isInVertical; return isInRectangle; } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 17.
  • 18.
     Restructures codewithout changing the behaviour  Improves code readability  Reduces complexity Refactoring 18 class ProblemSolver { public static void doMagic() { … } } class CommandParser { public static <T> Function<T, T> parseCommand() { … } } class DataModifier { public static <T> T execute() { … } } class OutputFormatter { public static void print() { … } }
  • 19.
     Breaking codeinto reusable units  Extracting parts of methods and classes into new ones Refactoring Techniques 19 depositOrWithdraw()  Improving names of variables, methods, classes, etc. deposit() withdraw()  Moving methods or fields to more appropriate classes String str; String name; Car.open() Door.open()
  • 20.
     You aregiven a working Student System project to refactor  Break it up into smaller functional units and make sure it works  It supports the following commands:  "Create <studentName> <studentAge> <studentGrade>"  creates a new student  "Show <studentName>"  prints information about a student  "Exit"  closes the program Problem: Student System 20 Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 21.
  • 22.
     Represent anumeric value from a fixed set as a text  We can use them to pass arguments to methods without making code confusing  By default enums start at 0  Every next value is incremented by 1 Enumerations 22 GetDailySchedule(0) GetDailySchedule(Day.Mon) enum Day {Mon, Tue, Wed, Thu, Fri, Sat, Sun}
  • 23.
     We cancustomize enum values Enumerations (1) 23 enum Day { Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sat(6),Sun(7); private int value; Day(int value) { this.value = value; } } System.out.println(Day.Sat); // Sat
  • 24.
     We cancustomize enum values Enumerations (2) 24 enum CoffeeSize { Small(100), Normal(150), Double(300); private int size; CoffeeSize(int size) { this.size = size; } public int getValue() { return this.size; } } System.out.println(CoffeeSize.Small.getValue()); // 100
  • 25.
     Create aclass PriceCalculator that calculates the total price of a holiday, by given price per day, number of days, the season and a discount type  The discount type and season should be enums  The price multipliers will be:  1x for Autumn, 2x for Spring, etc.  The discount types will be:  None – 0%  SecondVisit – 10%  VIP – 20% Problem: Hotel Reservation 25Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 26.
    Solution: Hotel Reservation(1) 26 public enum Season { Spring(2), Summer(4), Autumn(1), Winter(3); private int value; Season(int value) { this.value = value; } public int getValue(){ return this.value; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 27.
    Solution: Hotel Reservation(2) 27 public enum Discount { None(0), SecondVisit(10), VIP(20); private int value; Discount(int value) { this.value = value; } public int getValue() { return this.value; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 28.
    Solution: Hotel Reservation(3) 28 public class PriceCalculator { public static double CalculatePrice(double pricePerDay, int numberOfDays, Season season, Discount discount) { int multiplier = season.getValue(); double discountMultiplier = discount.getValue() / 100.0; double priceBeforeDiscount = numberOfDays * pricePerDay * multiplier; double discountedAmount = priceBeforeDiscount * discountMultiplier; return priceBeforeDiscount - discountedAmount; } } Check your solution here :https://judge.softuni.bg/Contests/1575/Working-with-Abstraction-Lab
  • 29.
    Static Keyword inJava Static Class, Variable, Method and Block 29
  • 30.
     Used formemory management mainly  Can apply with:  Nested class  Variables  Methods  Blocks  Belongs to the class than an instance of the class Static Keyword static int count; static void increaseCount() { count++; }
  • 31.
     A toplevel class is a class that is not a nested class  A nested class is any class whose declaration occurs within the body of another class or interface  Only nested classes can be static Static Class class TopClass { static class NestedStaticClass { } }
  • 32.
     Can beused to refer to the common variable of all objects  Еxample  The company name of employees  College name of students  Name of the college is common for all students  Allocate memory only once in class area at the time of class loading Static Variable
  • 33.
    Example: Static Variable(1) 33 class Counter { int count = 0; static int staticCount = 0; public Counter() { count++; // incrementing value staticCount++; // incrementing value } public void printCounters() { System.out.printf("Count: %d%n", count); System.out.printf("Static Count: %d%n", staticCount); } }
  • 34.
    Example: Static Variable(2) 34 // Inside the Main Class public static void main(String[] args) { Counter c1 = new Counter(); c1.printCounters(); Counter c2 = new Counter(); c2.printCounters(); Counter c3 = new Counter(); c3.printCounters(); int counter = Counter.staticCount; // 3 } Count: 1 Static Count: 1 Count: 1 Static Count: 2 Count: 1 Static Count: 3
  • 35.
     Belongs tothe class rather than the object of a class  Can be invoked without the need for creating an instance of a class  Can access static data member and can change the value of it  Can not use non-static data member or call non-static method directly  this and super cannot be used in static context Static Method 35
  • 36.
    class Calculate { staticint cube(int x) { return x * x * x; } public static void main(String args[]) { int result = Calculate.cube(5); System.out.println(result); // 125 System.out.println(Math.pow(2, 3)); // 8.0 } } Example: Static Method 36
  • 37.
     A setof statements, which will be executed by the JVM before execution of main method  Executing static block is at the time of class loading  A class can take any number of static block but all blocks will be executed from top to bottom Static Block 37
  • 38.
    class Main { staticint n; public static void main(String[] args) { System.out.println("From main"); System.out.println(n); } static { System.out.println("From static block"); n = 10; } } Example: Static Block 38 From static block From main 10
  • 39.
  • 40.
     Used togroup related classes  Like a folder in a file directory  Use packages to avoid name conflicts and to write a better maintainable code  Packages are divided into two categories:  Built-in Packages (packages from the Java API)  User-defined Packages (create own packages) Packages in Java
  • 41.
     The libraryis divided into packages and classes  Import a single class or a whole package that contain all the classes  To use a class or a package, use the import keyword  The complete list can be found at Oracles website: https://docs.oracle.com/en/java/javase/ Build-In Packages 41 import package.name.Class; // Import a single class import package.name.*; // Import the whole package
  • 42.
     …  … … Summary 42  Well organized code is easier to work with  We can reduce complexity using Methods, Classes and Projects  We can refactor existing code by breaking code down  Enumerations define a fixed set of constants  Represent numeric values  We can easily cast enums to numeric types  Static members and Packages
  • 43.
  • 44.
  • 45.
  • 46.
     Software University– High-Quality Education and Employment Opportunities  softuni.bg  Software University Foundation  http://softuni.foundation/  Software University @ Facebook  facebook.com/SoftwareUniversity  Software University Forums  forum.softuni.bg Trainings @ Software University (SoftUni)
  • 47.
     This course(slides, examples, demos, videos, homework, etc.) is licensed under the "Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International" license License 47

Editor's Notes

  • #3 (c) 2007 National Academy for Software Development - http://academy.devbg.org. All rights reserved. Unauthorized copying or re-distribution is strictly prohibited.*