This Nanodegree programme is designed to improve your Java skills and teach you the fundamental skills that Java developers use to design, code, test, and deploy cutting-edge Java software. It is ideal for programmers with little or no Java experience who want to establish themselves as professional Java developers and deploy functional Java-based applications of their own design.
Course 1: Java Fundamentals
Java Programming Basics
- Understand keywords and how they are used in Java.
- Be able to declare variables in Java.
- Describe the difference between primitive variables and objects.
- Apply casting to change the type of a variable into another type.
- Understand what truncation is and why it occurs.
- Create a method in Java.
- Describe the difference between Stack and Heap memory.
- Know the four different access modifier types.
- Create an array to store primitive variable types.
- Create each of the three different loops (While, do While and For) to iterate over an array.
- Create a Java program in IntelliJ.
- Describe the purpose of Javadoc.
- Explain what an object is and why we use them.
- Describe the differences between a class and an object.
- Know the parts and syntax for creating a class.
- Create different objects from a specific object type.
- Describe the purpose of Garbage Collection in Java.
- Describe what packages are in Java and why we use them.
- Apply Inheritance to share behavior and state between related classes.
- Apply polymorphism in Java to support decoupling.
- Describe the difference between an Interface and Abstract class.
- Apply throwing an Exception from a method when an issue is discovered.
- Create an Exception Handler to catch and handle an Exception.
- Use Enums to provide a predefined selection of constants.
- Use the Java Scanner class to read input from the console.
- Apply Java Data and Calendar class to store and manipulate day and time.
- Use the Java RegEx package to validate the input of a String.
- Use some of the advanced methods of the String class to create substring, search for text and investigate different characters of a string.
Generics and Collections
- Describe the purpose of using Generics in Java.
- Create a generic method that processes different class types without casting.
- Apply generics to Collections to create stronger type data sets.
- Use data structures that implement the Collection interface.
- Use the Collections utility class to sort a list of Strings.
Advanced Java Types
- Use Maps to store and retrieve data based on a key value.
- Use Sets to remove duplicate values from a List.
- Use a Queue to store values in a FIFO manner.
Project: Hotel Reservation Application
Students will design and build a hotel reservation application. Customers will be able to find and book a hotel room using the hotel reservation application. Rooms will include the price as well as the dates that the room is reserved. All room reservations will be associated with a single customer account, which will include the customer's name (first and last) and email address.Customers will be able to use the app to view a list of available rooms at the hotel. Customers will also be able to find and book rooms based on availability and price using the hotel reservation application.
Course 2: Advanced Java Programming Techniques
Functional Programming in Java
- Understand the differences between imperative and functional programming.
- Use functional interfaces, lambdas and method references to simplify and improve your Java code.
- Apply Java’s Stream API to perform quantitative analysis over large sets of data.
Working with Files and I/O
- Understand the differences between program memory and persistent storage.
- Know the different uses of binary and encoded data and understand when to use each.
- Use the Java Files API to read and write files.
- Recognize different kinds of resource leaks and apply modern Java techniques to prevent them.
- Serialize and deserialize between Java objects and common formats like JSON, XML and binary.
- Identify the principles of good software design and build strong software design intuition.
- Understand what design patterns are and why they are useful.
- Use Creational, Behavioral and Structural design patterns to write flexible and easy-to-understand code.
- Apply Dependency Injection to simplify object creation and promote testable designs.
- Use reflection and annotations to introspect and add dynamic capabilities to your programs.
- Implement Java interfaces at runtime using dynamic proxies.
- Understand the fundamentals of Aspect Oriented Programming.
- Use class loaders to customize how Java loads byte code.
Introduction to Concurrent Programming
- Recognize when concurrency can help improve the performance of Java programs.
- Use threads, thread pools and parallel streams to achieve parallelism in Java.
- Apply Java synchronization tools to correctly share state between threads in a parallel program.
Project: Legacy Web Crawler
Concurrency is a useful tool for improving the performance of Java programmes. You will use concurrent programming techniques to improve a legacy web crawler so that it can take advantage of multi-core architectures in this project. The crawler will read configuration from a JSON file, download and parse multiple HTML documents at the same time, and save popular web terms in an output file. You will also create a method profiling tool to measure the crawler's efficiency and demonstrate the benefits of the parallel crawler.
Course 3: Java Application Deployment
Running Java Applications
- Learn to use the tools of the JDK to compile, package and run Java applications.
- Recognize and evaluate bytecode.
- Use the JShell application to execute arbitrary Java code.
Dependency Management with Maven
- Read and write well-formed XML, including Maven pom.xml files.
- Use Maven to build Java projects and include external dependencies.
- Use Maven plugins to modify the build process and perform additional tasks such as generating API documentation and executing static code analysis.
- Identify and create Java 9 modules using the Module Descriptor class.
- Convert existing projects into module format.
- Use the JLink tool to create a custom JRE for a specific Java module.
Unit Testing with Java
- Explain the benefits of automated testing and identify the steps in the unit testing lifecycle.
- Write unit tests utilizing the features of JUnit 5 to cover all program requirements.
- Run unit tests automatically with Maven.
- Use tools in IntelliJ to identify any missing code coverage from your unit tests.
Mocking and Integration Testing
- Identify and create test doubles to isolate testing requirements from their dependencies
- Use the Mockito library to create and modify the behavior of test doubles.
- Understand the roles of Unit Testing, Integration Testing and Functional testing in the automated testing process.
- Create mock endpoints using Wiremock to isolate testing requirements from external API calls.
To put all of the skills learned in this course into practise, you will begin with an existing project that requires assistance. The UdaSecurity programme is a simple graphical user interface (GUI) application that allows users to manage their home security system. Some changes will be required to prepare the software for scaling. You'll need to refactor the programme into a multi-module Maven project, as well as write unit tests to ensure that it does what it says it does. To write a full unit test suite for the project, you'll use the JUnit 5 and Mockito libraries covered in this course.