# Java: Example - Variations on max()

Problem: Write a method to compute the maximum of two double values. Here are some possible solutions.

## Version 1 - Return immediately

This is a straightforward example of returning the value as soon as it's known.

    public static double max(double a, double b) {
        if (a > b) {
            return a;
        } else {
            return b;
        }
    }

## Version 2 - Single return

The orthodox philosophy of Structured Programming is that every method should have only one return at the end. To implement this, use a variable to hold the max value and return it at the end.

    public static double max(double a, double b) {
        double result;    // Stores the maximum value until the return.
        if (a > b) {
            result = a;
        } else {
            result = b;
        }
        return result;
    }

This method is clear in either style, but the rigid application of the one-return rule can make some methods very convoluted. The overriding principle that most programmers use is that program flow should be as clear as possible.

## Version 3 - No need for else when the true part returns.

    public static double max(double a, double b) {
        if (a > b) {
            return a;
        }
        return b;   // Only executed if comparison was false.
    }

## Version 4 - Typical hacker obfuscation

The hard-to-read `?:` operator is a favorite of programmers who want to impress others. It does result in shorter source code (but not more efficient execution). Most people don't find this more readable.

    public static double max(double a, double b) {
        return a>b?a:b;
    }

It could be made more readable with ()s and spacing.

        return (a > b) ? a : b;

## Other considerations

These examples illustrate/ignore important ideas.

- Library. Always prefer predefined methods (`Math.max()`) rather than writing your own!
- Public. Generally useful methods are normally declared `public`, allowing others to call them.
- Static. These methods don't use any state (instance variables) of the class it's in, and therefore are declared `static` (like the `Math.max()` methods).