Философия Java


Доступ класса - часть 2


Обратите внимание, что класс не может быть private (это сделало бы его никому не доступным кроме самого этого класса), или protected[35]. Итак, у Вас есть только выбор из двух вариантов: “дружественный” или публичный. Если Вы не хотите, чтобы кто-то другой имел доступ к классу, Вы можете сделать все конструкторы приватными, этим запрещая любому кроме Вас, создание объекта этого класса внутри статического члена класса.[36]. Вот пример:

//: c05:Lunch.java

// Демонстрирует спецификаторы доступа к классу.

// Делает класс приватным

// с помощью приватных конструкторов:

class Soup { private Soup() {} // (1) Позволяет создание с помощью статического метода:

public static Soup makeSoup() { return new Soup(); } // (2) Создание статического объекта

// возвращается ссылка на запрос.

// (шаблон "Singleton"):

private static Soup ps1 = new Soup(); public static Soup access() { return ps1; } public void f() {} }

class Sandwich { // Использует Lunch

void f() { new Lunch(); } }

// В файле только один публичный класс:

public class Lunch { void test() { // Вы не можете сделать это! Приватный контруктор:

//! Soup priv1 = new Soup();

Soup priv2 = Soup.makeSoup(); Sandwich f1 = new Sandwich(); Soup.access().f(); } } ///:~

До сих пор, большинство методов возвращали либо void либо примитивный тип, и описание:

public static Soup access() { return ps1; }

может вначале привести в замешательство. Слово перед именем метода (access) говорит о том, что возвращает метод. Пока чаще всего был тип void, и это означало, что метод не возвращает ничего. Но Вы можете возвратить также ссылку на объект, что и происходит здесь. Этот метод возвращает ссылку на объект класса Soup.

Класс Soup показывает как предотвратить прямое создание класса, сделав все конструкторы приватными. Запомните, что если Вы не сознаете явно ни одного конструктора, конструктор по умолчанию (конструктор без аргументов) сам будет создан для Вас. Если Вы напишите конструктор по умолчанию, он не будет создаваться автоматически. Если Вы сделаете его приватным, то никто не сможет создать объект этого класса. Но сейчас, как кто-нибудь сможет использовать этот класс? Пример выше показывает два варианта. Первый, с помощью статического метода создается объект типа Soup и возвращается ссылка на него. Это может быть полезно, если Вы хотите выполнить несколько дополнительных операций с классом Soup, перед тем как его возвратить, либо если Вы хотите хранить количество создаваемых объектов типа Soup (возможно для контроля их популяции).




Начало  Назад  Вперед