Статические поля и методы. Фабричные методы

Статические поля

Обычные поля (instance-поля) принадлежат объектам: у каждого телефона свой серийный номер, у каждого прямоугольника — свои координаты. Статические поля принадлежат классу. Разные объекты видят одно и то же статическое поле.

package online.javanese.basics.oop.statics;

public final class Something {

    private static int count;

    public Something() {
        System.out.println("Something #" + ++count);
    }

    public static void main(String[] args) {
        new Something();
        new Something();
        new Something();
        new Something();
    }

}
Something #1
Something #2
Something #3
Something #4

Константы

Константа — статическое (принадлежащее классу) финальное (неизменяемое) поле.

package online.javanese.basics.oop.statics;

public final class Point {

    private static final Point POINT_0_0 = new Point(0, 0);

Статические методы

Обычные методы (instance-методы) выполняются на объектах, например, phone.dial("…") — вызов метода dial на объекте phone.

Статические методы выполняются на классе.

package online.javanese.basics.oop.statics;

public final class Something {

    private static int count;
    
    public static int getInstanceCount() {
        return count;
    }

    public Something() {
        ++count;
    }

    public static void main(String[] args) {
        new Something();
        new Something();
        new Something();
        new Something();
        System.out.println(Something.getInstanceCount());
        // 4
    }

}

Фабричные методы

Можно создавать статические методы, которые создают объекты.

Во-первых, у статических методов могут быть разные названия, это делает их использование более понятным, чем использование конструкторов.

Во-вторых, в отличие от конструктора, статический метод не обязан создавать новый объект, он может вернуть существующий.

package online.javanese.basics.oop.statics;

public final class Point {

    private static final Point POINT_0_0 = new Point(0, 0);

    private final double x;
    private final double y;

    // запретить создавать объекты непосредственно
    private Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    // getX, getY, toString — без изменений

    public static Point at(double x, double y) {
        if (x == 0 && y == 0) {
            // Если часто нужна точка (0; 0),
            // можно возвращать один и тот же объект.
            return POINT_0_0;
        }
        return new Point(x, y);
    }
    
    public static Point withOffset(Point original, double dx, double dy) {
        if (dx == 0 && dy == 0) {
            // Требуется сдвиинуть точку на 0 —
            // можно вернуть тот же объект.
            return original;
        }
        return at(original.x + dx, original.y + dy);
    }

}

Такие действия допустимы только с неизменяемыми объектами.

Комментарии к уроку

Сообщить об ошибке