Компонентный подход в программировании

       

Дополнительные элементы описания операций


В обоих языках (в Java — начиная с версии 5) имеются конструкции, позволяющие описывать операции с неопределенным числом параметров (как в функции printf стандартной библиотеки C). Для этого последний параметр нужно пометить специальным образом. Этот параметр интерпретируется как массив значений указанного типа. При вызове такой операции можно указать обычный массив в качестве ее последнего параметра, но можно и просто перечислить через запятую значения элементов этого массива или ничего не указывать в знак того, что он пуст. Детали декларации таких параметров несколько отличаются.

В Java нужно указать тип элемента массива, многоточие и имя параметра.

В C# нужно указать модификатор params, тип самого массива и имя параметра.

public class A { public int f(int ... a) { return a.length; }

public static void main(String[] args) { A a = new A();

System.out.println ( a.f(new int[]{9, 0}) ); System.out.println ( a.f(1, 2, 3, 4) ); } }

using System;

public class A { public int f(params int[] a) { return a.Length; }

public static void Main { A a = new A();

Console.WriteLine ( a.f(new int[]{9, 0}) ); Console.WriteLine ( a.f(1, 2, 3, 4) ); } }

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

Точнее, все исключения делятся на два вида — проверяемые (checked) и непроверяемые (unchecked). Непроверяемыми считаются исключения, возникновение которых может быть непреднамеренно — обращение к методу или полю по ссылке, равной null, превышение ограничений на размер стека или занятой динамической памяти, и пр. Проверяемые исключения предназначены для передачи сообщений о возникновении специфических ситуаций и всегда явно создаются в таких ситуациях.

Непроверяемое исключение должно иметь класс, наследующий java.lang.Error, если оно обозначает серьезную ошибку, которая не может быть обработана в рамках обычного приложения, или java.lang.RuntimeException, если оно может возникать при нормальной работе виртуальной машины Java. Если класс исключения не наследует одному из этих классов, оно считается проверяемым.



Все классы проверяемых исключений, возникновение которых возможно при работе метода, должны быть описаны в его заголовке после ключевого слова throws.

Если некоторый метод вызывает другой, способный создать проверяемое исключение типа T, то либо этот вызов должен быть в рамках try-блока, для которого имеется обработчик исключений типа T или более общего типа, либо вызывающий метод тоже должен указать тип T или более общий среди типов исключений, возникновение которых возможно при его работе.

В C# исключения, возникновение которых возможно при работе метода, никак не описываются.

public void m(int x) throws MyException { throw new MyException(); }

public void n(int x) throws MyException { m(x); }

public void k(int x) { try { m(x); } catch(MyException e) { ... } }

В Java все параметры операций передаются по значению.

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

В C# можно определить параметры операций, передаваемые по ссылке, и выходные параметры операций.

Параметры, передаваемые по ссылке, помечаются модификаторов ref. Выходные параметры помечаются модификатором out.

При вызове операции значения этих параметров должны быть помечены так же.

using System;

public class A { public void f (int a, ref int b, out int c) { c = b - a; b += a; }

public static void Main() { A a = new A(); int n = 3, m = 0;

Console.WriteLine ("n = " + n + " , m = " + m); a.f(1, ref n, out m); Console.WriteLine ("n = " + n + " , m = " + m); } }



Содержание раздела