Рассмотрим практическое применение средств управления доступом на примере приведенной ниже программы. Во время ее выполнения предотвращается возникновение ошибок нарушения границ отказоустойчивого целочисленного массива. Это достигается следующим образом. Массив объявляется как закрытый член класса, а доступ к нему осуществляется с помощью специально предназначенных для этой цели методов. Эти методы отслеживают попытки обращения к элементам, не входящим в массив, и вместо аварийной остановки программы возвращают сообщение об ошибке. Массив определяется в классе FailSof tArray, код которого приведен ниже. /* В этом классе реализуется отказоустойчивый массив, предотвращающий ошибки при выполнении программы. */ class FailSoftArray { private int a[]; // Ссылка на массив. private int errval; // Значение, возвращаемое в том случае, если // в методе get будет обнаружена ошибка, public int length; // Переменная length открыта. /* Конструктору данного класса передается размер массива и значение, которое должен возвращать метод get при обнаружении ошибки. */ public FailSoftArray(int size, int errv) { a = new int[size]; errval = errv; length = size; } // возвратить значение элемента массива по заданному индексу public int get(int index) { // Отслеживание попытки обращения за границы массива. if(ok(index)) return a[index]; return errval; } // установить значение элемента no заданному индексу, // если возникнет ошибка, возвратить логическое значение false public boolean put(int index, int val) { // Отслеживание попытки обращения эа границы массива. if(ok(index)) { a[index] = val; return true; } return false; } // возвратить логическое значение true, если индекс // не выходит за границы массива private boolean ok(int index) { if(index >= 0 & index < length) return true; return false; } } // продемонстрировать обращение к отказоустойчивому массиву class FSDemo { public static void main(String args[]) { FailSoftArray fs = new FailSoftArray(5, -1); int x; // выявить скрытые сбои при обращении к массиву System.out.println("Fail quietly.") ; for(int i=0; i < (fs.length * 2); i++) // Доступ к массиву должен осуществляться с помощью // специально предназначенных для этого методов, fs.put(i, i*10); for (int i=0; i < (fs.length * 2); i++) { // Доступ к массиву должен осуществляться с помощью // специально предназначенных для этого методов. х = fs.get (i); if(x != -1) System.out.print(x + " "); } System.out.println ("") ; // а теперь обработать сбои и вывести сообщения об ошибках System.out.println("\nFail with error reports."); for (int i=0; i < (fs.length * 2); i++) if (!fs.put(i, i*10)) System.out.println("Index " + i + " out-of-bounds"); for(int i=0; i < (fs.length * 2); i++) { x = fs.get (i); if(x != -1) System.out.print(x + " ") ; else System.out.println("Index " + i + " out-of-bounds"); } } }
Выполнение этой программы дает следующий результат: Fail quietly. 0 10 20 30 40 Fail with error reports. Index 5 out-of-bounds Index 6 out-of-bounds Index 7 out-of-bounds Index 8 out-of-bounds Index 9 out-of-bounds 0 10 20 30 40 Index 5 out-of-bounds Index 6 out-of-bounds Index 7 out-of-bounds Index 8 out-of-bounds Index 9 out-of-bounds
Рассмотрим подробнее приведенный выше пример программы. В классе Fail So ft Array определены три закрытых члена. Первым из них является перемен¬ ная а, в которой содержится ссылка на массив, предназначенный для хранения данных. Вторым членом является переменная errval, в которой хранится значение, возвращае¬ мое вызывающей части программы в том случае, если вызов метода get оказывает¬ ся неудачным. И третьим членом является метод ok , в котором определяется, нахо¬ дится ли индекс в границах массива. Эти три члена могут быть использованы только другими членами класса FailSof tArray. Остальные члены данного класса объявлены открытыми и могут быть вызваны из любой части программы, где используется класс FailSoftArray.