Допустим, есть неизменный тип записи:
public class Record
{
public Record(int x, int y) {
Validator.ValidateX(x);
Validator.ValidateY(y);
X=x;
Y=y;
}
public final int X;
public final int Y;
public static class Validator {
public void ValidateX(int x) { if(x < 0) { throw new UnCheckedException; } }
public void ValidateY(int y) { if(y < 0) { throw new UnCheckedException; } }
}
}
Обратите внимание, что генерируется непроверенное исключение. Причина в том, что это объект, который используется довольно часто, и неудобно иметь дело с проверенным исключением.
Однако, если этот объект находится в библиотеке классов, где он может использоваться для проверки пользовательских входных данных (или некоторых других внешних входных данных). Теперь он начинает звучать так, как будто это должно быть исключение CHECKED, потому что входы больше не зависят от программиста.
Мысли все? я должен сделать проверено или не проверено, или есть лучший дизайн для этого?
UPDATE:
моя путаница исходит из этого scenerio: обычно запись будет использоваться так:
Record r = new Record(1,2);
OtherObj o = new OtherObj(r);
там дело за программистом, так что непроверенное исключение в порядке.
Однако, когда вы получаете параметры для Записи от пользователя, вы хотите проверить их правильно? так что вы можете позвонить
Record.ValidateX(inputX);
Record.ValidateY(inputY);
Там может возникнуть выбранное исключение, поскольку входы больше не контролируются?
Извините, я обычно не слишком беспокоюсь об этом (лично я считаю, что без проверки это нормально). но это на самом деле проблема в домашнем задании, и я хочу сделать это правильно, лол.
* * ОБНОВЛЕНИЕ тысячи двадцать-три (2):
Я начинаю думать, что мне нужно, чтобы ValidateX генерировал проверенное исключение, потому что это обычно то, что будет использоваться, если задействован пользовательский ввод. В этом случае мы могли бы снова попросить пользователя ввести данные. Тем не менее, для конструктора Record он выдаст проверенное исключение, поскольку создание Record с недопустимыми аргументами является нарушением API. Новый код будет выглядеть так:
public class Record
{
public Record(int x, int y) {
try
{
Validator.ValidateX(x);
Validator.ValidateY(y);
}catch(CheckedException xcpt) { throw new UnCheckedException(xcpt.getMessage()); }
X=x;
Y=y;
}
public final int X;
public final int Y;
public static class Validator {
public void ValidateX(int x) throws CheckedException { if(x < 0) { throw new CheckedException; } }
public void ValidateY(int y) throws CheckedException { if(y < 0) { throw new CheckedException; } }
}
}
Теперь программист может проверить параметры перед передачей их в класс Record. Если это не так, это является нарушением API и генерируется непроверенное исключение.
Как это звучит?!