Oracle Certified Professional Java SE 8 Programmer
1 Java Class Design
1-1 Implement encapsulation
1-2 Implement inheritance including visibility modifiers and composition
1-3 Implement polymorphism
1-4 Override hashCode, equals, and toString methods from Object class
1-5 Create and use singleton classes and immutable classes
1-6 Develop code that uses static keyword on initializers, variables, methods, and classes
2 Advanced Java Class Design
2-1 Develop code that uses abstract classes and methods
2-2 Develop code that uses the final keyword
2-3 Create inner classes including static inner class, local class, nested class, and anonymous inner class
2-4 Use enumerated types including methods, and constructors in an enum type
2-5 Develop code that declares, implements andor extends interfaces and use the atOverride annotation
2-6 Create and use Lambda expressions
3 Generics and Collections
3-1 Create and use a generic class
3-2 Create and use ArrayList, TreeSet, TreeMap, and ArrayDeque objects
3-3 Use java util Comparator and java lang Comparable interfaces
3-4 Collections Streams and Filters
3-5 Iterate using forEach methods of Streams and List
3-6 Describe Stream interface and Stream pipeline
3-7 Use method references with Streams
4 Lambda Built-in Functional Interfaces
4-1 Use the built-in interfaces included in the java util function package such as Predicate, Consumer, Function, and Supplier
4-2 Develop code that uses primitive versions of functional interfaces
4-3 Develop code that uses binary versions of functional interfaces
4-4 Develop code that uses the UnaryOperator interface
5 Java Stream API
5-1 Develop code to extract data from an object using map, peek, and flatMap methods
5-2 Search for data by using search methods of the Stream classes including findFirst, findAny, anyMatch, allMatch, noneMatch
5-3 Develop code that uses the Optional class
5-4 Develop code that uses Stream data methods and calculation methods
5-5 Sort a collection using Stream API
5-6 Save results to a collection using the collect method and grouppartition data using the Collectors class
5-7 Use flatMap() methods in the Stream API
6 Exceptions and Assertions
6-1 Use try-catch and throw statements
6-2 Use catch, multi-catch, and finally clauses
6-3 Use Autoclose resources with a try-with-resources statement
6-4 Create custom exceptions and Auto-closeable resources
6-5 Test invariants by using assertions
7 Use Java SE 8 DateTime API
7-1 Create and manage date-based and time-based events including a combination of date and time into a single object using LocalDate, LocalTime, LocalDateTime, Instant, Period, and Duration
7-2 Work with dates and times across time zones and manage changes resulting from daylight savings including Format date and times values
7-3 Define and create and manage date-based and time-based events using Instant, Period, Duration, and TemporalUnit
8 Java File IO (NIO 2)
8-1 Operate on file and directory paths using the Paths class
8-2 Check, delete, copy, and move files and directories using the Files class
8-3 Recursively access a directory tree using the DirectoryStream and FileVisitor interfaces
8-4 Find a file by using the PathMatcher interface, and use Java SE 8 IO improvements, including Files find(), Files walk(), and lines() methods
8-5 Observe the changes in a directory by using WatchService
9 Java Concurrency
9-1 Create worker threads using Runnable, Callable and use an ExecutorService to concurrently execute tasks
9-2 Identify potential threading problems among deadlock, starvation, livelock, and race conditions
9-3 Use synchronized keyword and java util concurrent atomic package to control the order of thread execution
9-4 Use java util concurrent collections and classes including CyclicBarrier and CopyOnWriteArrayList
9-5 Use parallel ForkJoin Framework
9-6 Use parallel Streams including reduction, decomposition, merging processes, pipelines, and performance
10 Building Database Applications with JDBC
10-1 Describe the interfaces that make up the core of the JDBC API including the Driver, Connection, Statement, and ResultSet interfaces and their relationship to provider implementations
10-2 Identify the components required to connect to a database using the DriverManager class including the JDBC URL
10-3 Submit queries and read results from the database including creating statements, returning result sets, iterating through the results, and properly closing result sets, statements, and connections
10-4 Use PreparedStatement to perform CRUD operations
10-5 Use CallableStatement to call stored procedures
10-6 Use Transactions including disabling auto-commit mode, committing and rolling back transactions
10-7 Use JDBC batch operations
10-8 Create and use RowSet objects using RowSetProvider and RowSetFactory
11 Localization
11-1 Read and set the locale by using the Locale object
11-2 Create and manage date- and time-based events by using Localization including formatting dates, numbers, and currency values
11-3 Work with dates, numbers, and currency values by using the NumberFormat and DateFormat classes and their derived classes such as DecimalFormat and SimpleDateFormat
11-4 Build a user interface for a localized application
11-5 Describe the advantages of localizing an application
Implement Encapsulation

Implement Encapsulation

Encapsulation is a fundamental concept in object-oriented programming (OOP) that involves bundling the data (attributes) and methods (functions) that operate on the data into a single unit, known as a class. The key idea behind encapsulation is to hide the internal state of an object and to provide access to it only through a well-defined interface, typically through getter and setter methods.

Key Concepts

1. Data Hiding

Data hiding is the practice of restricting access to certain attributes or methods of a class. In Java, this is achieved by declaring the attributes as private. Private attributes cannot be accessed directly from outside the class, ensuring that the internal state of the object is protected from unintended modifications.

2. Access Modifiers

Access modifiers in Java, such as private, public, and protected, control the visibility of class members. For encapsulation, the private modifier is crucial as it restricts access to the class's attributes, forcing external code to use the class's public methods to interact with the data.

3. Getter and Setter Methods

Getter methods (also known as accessors) are used to retrieve the values of private attributes, while setter methods (also known as mutators) are used to modify them. These methods provide a controlled way to access and modify the internal state of an object, allowing for validation and other logic to be applied before changes are made.

Detailed Explanation

Data Hiding

Consider a class BankAccount with a private attribute balance. By making balance private, you prevent direct access to it from outside the class. This ensures that the balance can only be modified through the class's methods, which can include checks to prevent invalid transactions.

Access Modifiers

In the BankAccount class, the balance attribute is declared as private: private double balance;. This means that only methods within the BankAccount class can access and modify the balance directly. External code must use the public methods provided by the class to interact with the balance.

Getter and Setter Methods

To allow controlled access to the balance, the BankAccount class provides public getter and setter methods. For example:

public double getBalance() {
    return balance;
}

public void setBalance(double balance) {
    if (balance >= 0) {
        this.balance = balance;
    } else {
        System.out.println("Invalid balance");
    }
}
    

The getBalance method allows external code to retrieve the current balance, while the setBalance method allows setting the balance with a check to ensure it is not negative.

Examples and Analogies

Example: Bank Account

Imagine a bank account as a class. The account balance is a sensitive piece of information that should not be directly accessible to everyone. By encapsulating the balance and providing methods to interact with it, the bank ensures that only valid operations are performed on the account. For instance, you cannot withdraw more money than what is available in the account.

Analogy: Locked Safe

Think of encapsulation as a locked safe. The contents of the safe (data) are hidden from view and cannot be accessed directly. To access the contents, you need a key (getter and setter methods). This ensures that only authorized individuals can access or modify the contents, and they must follow the rules set by the safe's owner.

Conclusion

Encapsulation is a powerful mechanism that enhances the security, reliability, and maintainability of your code. By hiding the internal state of objects and providing controlled access through methods, you can ensure that your data is protected and that operations on it are valid and consistent.