Шаг 49.
Язык программирования Java.
Статические внутренние классы

На этом шаге мы рассмотрим статические внутренние классы

Иногда внутренний класс требуется лишь для того, чтобы скрыть его внутри другого класса, тогда как ссылка на объект внешнего класса не нужна. Подавить формирование такой ссылки можно, объявив внутренний класс статическим, то есть static.

Допустим, в массиве требуется найти максимальное и минимальное число. Конечно, для этого можно было бы написать два метода: один - для нахождения максимального числа, а другой - для нахождения минимального числа. Но при вызове обоих методов массив просматривается дважды. Было бы намного эффективнее просматривать массив только один раз, одновременно определяя в нем как максимальное, так и минимальное число следующем образом:

double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;

for (double v : values) {
	if (min > v) {
		min = v;
	}
	if (max < v) {
		max = v;
	}
}

Но в таком случае метод должен возвращать два значения. Сделать это можно, определив класс Pair с двумя полями для хранения числовых значений, как показано ниже:

class Pair {
    private double first;
    private double second;

    public Pair(double first, double second) {
        this.first = first;
        this.second = second;
    }
    public double getFirst() {
        return first;
    }
    public double getSecond() {
        return second;
    }
}

Тогда метод minmax() сможет возвратить объект типа Pair следующим образом:

class ArrayAlg {
    ...
    public static Pair minmax(double[] values) {
        ...
        return new Pair(min, max);
    }
}

Таким образом, для получения максимального и минимального чисел достаточно вызвать методы getFirst() и getSecond(), как показано ниже:

   Pair p = ArratAlg.minmax(d);
   System.out.println("min = " + p.getFirst());
   System.out.println("max = " + p.getSecond());

Но заметим, что имя Pair слишком широко распространено, и при выполнении крупного проекта у другого программиста может возникнуть такая же блестящая идея, вот только класс Pair у него будет содержать не числовые, а строковые поля. Это вполне вероятное затруднение можно разрешить, сделав класс Pair внутренним и определенным в классе ArrayAlg. Тогда подлинным именем этого класса будет не Pair, а ArrayAlg.Pair:

                       ArrayAlg.Pair p = ArrayAlg.minmax(d);

Но в отличие от внутренних классов, применявшихся в предыдущих примерах, ссылка на другой объект в классе Pair не требуется. Ее можно подавить, объявив внутренний класс статическим:

class ArrayAlg {
   ...
    public static class Pair {
        ...
    }
}

Понятно, что только внутренние классы можно объявлять статическими. Статический внутренний класс ничем не отличается от любого другого внутреннего класса, за исключением того, что его объект не содержит ссылку на создавший его объект внешнего класса. В данном примере следует применять статический внутренний класс, поскольку объект внутреннего класса создается в теле статического метода, как показано ниже:

public static Pair minmax(double[] d) {
    …
    return new Pair(min, max);
}

Если бы класс Pair не был объявлен статическим, компилятор сообщил бы, что при инициализации объекта внутреннего класса объект типа ArrayAlg недоступен.

На следующем шаге мы закончим изучение данного вопроса

Предыдущий шаг Содержание Следующий шаг