KotlinCS 124 LogoJava
PrevIndexNext
Kotlin
Java
  • Implementing a Map : 04/26/2024

  • Streams : 04/25/2024

  • Generics : 04/24/2024

  • Hashing : 04/23/2024

  • Binary Search : 04/22/2024

  • MP3: Course Ratings : 04/19/2024

  • Quicksort : 04/18/2024

  • Merge Sort : 04/17/2024

  • Sorting Algorithms : 04/16/2024

  • MP Debugging Part 1 : 04/15/2024

  • MP2: Course Activity : 04/12/2024

  • Practice with Recursion : 04/11/2024

  • MP Debugging Part 0 : 04/10/2024

  • MP2: API Client : 04/09/2024

  • MP2: API Server : 04/08/2024

  • Trees and Recursion : 04/05/2024

  • Trees : 04/04/2024

  • Recursion : 04/03/2024

  • MP1: Filtering and Search : 04/02/2024

  • MP1: Loading and Sorting : 04/01/2024

  • Lists Review and Performance : 03/29/2024

  • Linked Lists : 03/28/2024

  • Algorithms and Lists : 03/27/2024

  • Continuing MP0 : 03/26/2024

  • Getting Started with MP0 : 03/25/2024

  • Lambda Expressions : 03/22/2024

  • Anonymous Classes : 03/21/2024

  • Practice with Interfaces : 03/20/2024

  • Implementing Interfaces : 03/19/2024

  • Using Interfaces : 03/18/2024

  • Working with Exceptions : 03/08/2024

  • Throwing Exceptions : 03/07/2024

  • Catching Exceptions : 03/06/2024

  • References and Polymorphism : 03/05/2024

  • References : 03/04/2024

  • Data Modeling 2 : 03/01/2024

  • Equality and Object Copying : 02/29/2024

  • Polymorphism : 02/28/2024

  • Inheritance : 02/27/2024

  • Data Modeling 1 : 02/26/2024

  • Static : 02/23/2024

  • Encapsulation : 02/22/2024

  • Constructors : 02/21/2024

  • Objects, Continued : 02/20/2024

  • Introduction to Objects : 02/19/2024

  • Compilation and Type Inference : 02/16/2024

  • Practice with Collections : 02/15/2024

  • Maps and Sets : 02/14/2024

  • Lists and Type Parameters : 02/13/2024

  • Imports and Libraries : 02/12/2024

  • Multidimensional Arrays : 02/09/2024

  • Practice with Strings : 02/08/2024

  • null : 02/07/2024

  • Algorithms and Strings : 02/06/2024

  • Strings : 02/05/2024

  • Functions and Algorithms : 02/02/2024

  • Practice with Functions : 02/01/2024

  • More About Functions : 01/31/2024

  • Errors and Debugging : 01/30/2024

  • Functions : 01/29/2024

  • Practice with Loops and Algorithms : 01/26/2024

  • Algorithms : 01/25/2024

  • Loops : 01/24/2024

  • Arrays : 01/23/2024

  • Compound Conditionals : 01/22/2024

  • Conditional Expressions and Statements : 01/19/2024

  • Operations on Variables : 01/18/2024

  • Variables and Types : 01/17/2024

  • Welcome to CS 124 : 01/16/2024

Anonymous Classes

interface Adder {
int addTo(int value);
}
Adder addOne = new Adder() {
@Override
public int addTo(int value) {
return value + 1;
}
};
Adder addEight = new Adder() {
@Override
public int addTo(int value) {
return value + 8;
}
};
System.out.println(addOne.addTo(1));
System.out.println(addEight.addTo(1));
System.out.println(addOne.addTo(8));

This lesson ventures into interesting uncharted territory. Until now, our classes have needed to have names. But, Java doesn’t actually require this! Let’s explore anonymous classes and their uses…

Please note that the next two lessons are on fairly advanced topics. You will see and need to understand code that uses these ideas, but testing on them will be limited.

Warm Up Debugging Challenge
Warm Up Debugging Challenge

But… hold on! Let’s warm up with another graded debugging challenge!

Anonymous Classes
Anonymous Classes

We’ve seen how to define what is called a named class. This should be familiar to us by now:

// Person is a named class
public class Person { }

However, Java also allows us to define so-called anonymous classes. Let’s go through an example carefully:

public class Person {
public String getType() {
return "Person";
}
}
Person person = new Person();
Person student = new Person() {
@Override
public String getType() {
return "Student";
}
};
System.out.println(person.getType());
System.out.println(student.getType());

In contrast to named classes, anonymous classes:

Capturing Variables
Capturing Variables

Anonymous classes can capture the value of variables that are available when they are created. This can be extremely useful. However, there are limitations to this approach. Most importantly, the variables that are captured must either be final or effectively final.

Let’s look at an example:

public class Person {
public String getType() {
return "Person";
}
}
// Show variable capture

Uses for Anonymous Classes
Uses for Anonymous Classes

We can create anonymous classes in Java. Cool! But… so what!? What problems can these classes solve?

Surprisingly, anonymous classes turn out to be common and quite powerful. Let’s look at an example.

Imagine that we want to count the number of elements in an int array that meet some condition. The condition could be that the element was positive, or negative, or odd, or even, or divisible by three, or whatever.

One approach would be to write separate methods for each thing we would want to count:

int countArrayPositive(int[] values) {
int count = 0;
for (int value : values) {
if (value >= 0) {
count++;
}
}
return count;
}
int countArrayNegative(int[] values) {
int count = 0;
for (int value : values) {
if (value < 0) {
count++;
}
}
return count;
}
int countArrayEven(int[] values) {
int count = 0;
for (int value : values) {
if (value % 2 == 0) {
count++;
}

Wow, this is getting tedious—and we’ve only done three! Imagine if we had a bunch of different conditions we needed to handle… But they are all very similar. There must be a better way.

Let’s see how to rewrite the code above using an anonymous class in a way that makes the counting logic completely flexible.

int countArrayPositive(int[] values) {
int count = 0;
for (int value : values) {
if (value >= 0) {
count++;
}
}
return count;
}
int countArrayNegative(int[] values) {
int count = 0;
for (int value : values) {
if (value < 0) {
count++;
}
}
return count;
}
System.out.println(countArrayPositive(array));

Practice: Bracket an Anonymous Class

Created By: Geoffrey Challen
/ Version: 2020.10.0

Declare a public class Bracketer providing one static method create. create takes a single int parameter and returns an anonymous object that implements the Bracket interface:

The returned object should implement top so that it returns the passed int and bottom so that it returns the passed int * -1. So, for example:

Practice: String Both Ways Anonymous Class

Created By: Geoffrey Challen
/ Version: 2021.10.0

Declare a public class BothWays providing one static method create. create takes a single String parameter and returns an anonymous object that implements the IBothWays interface:

So, for example:

If the String passed to create is null, throw an IllegalArgumentException.

Homework: Which Hemisphere Anonymous Class

Created By: Geoffrey Challen
/ Version: 2022.10.0

Create a public class named WhichHemisphere that provides a single class method named create. create accepts a Position object and returns an anonymous object that implements the IWhichHemisphere interface:

The return values of isNorthern and isSouthern are determined by the latitude value on the passed Position object, which you can retrieve as a double using getLatitude. Here's how your class should work:

However, note that the latitude values of the passed Position object can change after it is passed to your method! So you should not precompute the results of isNorthern and isSouthern, but rather calculate them in your anonymous class when the corresponding methods are called.

We define any position with a positive latitude as being in the Northern Hemisphere, and with a negative latitude as being in the Southern Hemisphere. Meaning, for the purposes of this problem, points on the equator are in neither hemisphere.

CS People: Shoshana Zuboff
CS People: Shoshana Zuboff

Shoshana Zuboff is an author and professor at the Harvard Business School, where she was the first tenured female professor. She may be best known for coining the term “surveillance capitalism”, and for her book “The Age of Surveillance Capitalism”, which outlines a global system of behavioral modification based on the collection and mining of data about our private lives.

In the short video below Shoshana Zuboff defines surveillance capitalism and discusses how it mirrors and differs from previous eras of capitalism:

More Practice

Need more practice? Head over to the practice page.