IT-professional

Java Best Practices and Design Patterns

Attend this Java Best Practises and Design Patterns training course and learn to solve real-world software development problems, and deliver responsive applications that are fast and reliable.

Course objectives

Learn how to leverage Java best practises, avoid pitfalls and perform industry-standard software development techniques. Learn design patterns in Java to implement proven solutions to reoccurring problems, and apply idioms and patterns to improve your Java code.

  • Employ best practises to build reliable and scalable Java applications
  • Effectively apply test-driven development to enhance program maintainability
  • Solve architectural problems with proven design patterns
  • Employ advanced Java APIs for multi-threaded programming

Prerequisites

  • Knowledge at the level of:
    • Java Programming Introduction
  • Three to six months of Java programming experience
  • You should be able to:
    • Understand Java classes, the inheritance model, polymorphism, and encapsulation
    • Use fundamental standard edition Java APIs
    • Apply object-oriented analysis and design, including defining classes and creating objects

Outline

Module 1: Effective Programming in Java

  • Clarifying the goals of best practises
  • Identifying the key characteristics of high-quality software
  • Organising classes, packages and subsystems into layers
  • Designing to the principles of SOLID

Module 2: Applying Test-Driven Development
Exploiting a testing framework

  • Composing and maintaining JUnit tests
  • Taking advantage of advanced JUnit features
  • Testing in the presence of exceptions

Module 3: Leveraging Design Patterns
Employing common design patterns

  • Observer
  • Iterator
  • Template method
  • Strategy
  • State
  • Singleton
  • Data Accessor Object
  • Data Transfer Object
  • Composite
  • ServiceLocator
  • Proxy
  • Factory

Module 4: Extending Applications with Java Meta Programming
Improving type safety with generics and enum types

  • Creating generic classes and methods
  • Navigating generic class hierarchies
  • Implementing enum types for fixed sets of constants

Adding metadata by writing annotations

  • Leveraging the built-in and custom annotations
  • Annotating with meta-annotations

Modifying runtime behaviour with reflection

  • Retrieving class and method data dynamically
  • Flagging methods with naming conventions
  • Adding information to code with annotations
  • Assessing disadvantages of reflection

Module 5: Tuning for Maximum Performance
Measuring and improving performance

  • Assessing response time
  • Conducting load and stress tests
  • Specifying strategies for improving performance

Exploiting garbage collectors

  • Exploring garbage collection metrics
  • Choosing appropriate algorithms for garbage collection
  • Avoiding the hazards of finalizers
  • Preventing memory leaks with reference types

Taking full advantage of threads

  • Writing reliable thread-safe code
  • Avoiding race hazards and deadlocks
  • Employing the Executors framework

Bulletproofing a threaded application

  • Synchronising and sharing data between threads
  • Managing the performance implications of synchronization

Exploring alternatives to synchronization

  • Taking advantage of the volatile modifier
  • Eliminating data sharing with ThreadLocal variables

Module 6: Architecting for Separation of Concerns
Allocating responsibilities to components

  • Translating method calls with the adaptor pattern
  • Adding behaviour with a proxy

Centralising the creation of objects

  • Employing factories to achieve loose coupling
  • Implementing Inversion of Control (IoC)