Обязательно ли для методов установки иметь один аргумент? Обычно методы установки принимают один аргумент как значение определенного свойства объекта. Что, если я хочу сначала проверить действительность, которая зависит от другого аргумента, который является логическим, если истинно, сначала проверить, иначе просто установите значение.
Я получаю значения от клиентов через ftp-сервер. Иногда эти файлы содержат мусорные значения. Например, номер телефона # 3432838 # 9. Поэтому, прежде чем устанавливать значение, мне нужно удалить эти символы мусора. Могу ли я сделать это в методах установки? Это правильный подход?
Заранее спасибо!
Обновлено:
Действительно ли это:
public void setSomething(String strValue){
if (checkValidity(strValue)){
// set the value
} else {
// set the value to an empty string
}
}
Просто добавил ответ в свой фрагмент




Установщик спецификации Java Bean имеет один аргумент. Если вы добавите еще один, по какой-либо причине, он больше не будет считаться сеттером.
Сеттер вполне допустим, чтобы «очистить» свой аргумент или выбросить исключение, если он недопустим.
Это необходимо специально в модели фреймворка java bean, но в целом это не обязательно.
У вас могут быть сеттеры без аргументов, если они предназначены для "переключения" значения.
void setCheck()
может, например, означать установить для логического атрибута "check" значение true.
Таким образом, даже если это не «сеттер» в смысле этого термина в java bean-компонентах, вы можете представить себе сеттер, используемый для других целей.
Кроме того, согласно разделу 7 спецификаций JavaBean, установщик может иметь более одного аргумента, например, для индексированных свойств (индексированное свойство поддерживает диапазон значений. Каждый раз, когда свойство читается или записывается, вы просто указываете индекс, чтобы определить, какое значение вы хотите. )
void setter(int index, PropertyType value); // indexed setter
void setter(PropertyType values[]); // array setter
В вашем случае правильным подходом будет добавить исключение времени выполнения к подписи нашей функции. Таким образом, вы не устанавливаете ненужную проверку исключений во время компиляции для всех других классов, которые уже вызывают ваш установщик.
Или вы можете рассматривать свое свойство как Ограниченная собственность и добавить исключение, не связанное с выполнением.
Для поддержки PropertyVetoException требуются методы установки ограниченных свойств. Эти документы для пользователей ограниченного свойства, которые пытались обновить, могут быть наложено вето. Итак, простое ограниченное свойство может выглядеть так:
PropertyType getFoo();
void setFoo(PropertyType value) throws PropertyVetoException;
что позволяет при необходимости добавить VetoableChangeListener.
Что касается вашего фрагмента, он «действителен», но не может быть оптимальным, потому что (как сказано в этот вопрос):
Но void setCheck () больше не является «установщиком». Это простой метод, имя которого начинается с «set».
Верно: я просто имел в виду, что «сеттер» не обязательно прикреплен к Java Bean. Его можно отклонить для других целей.
Почему нет. Проверка и подтверждение ввода - хороший вариант для включения в установщик. Вопрос в том, хотите ли вы разрешить установку члена без проверки.
Возможно, вам понадобится стандартная форма установщика для какой-либо структуры, которую вы используете (использование в качестве bean-компонента). Но если вы не ограничены таким образом, вы можете попробовать это.
Вы также можете использовать утверждения в установщике, если считаете, что другой код должен выполнять проверку, но неправильные значения никогда не должны устанавливаться.
В книге «Эффективное Java 2-е издание» Джошуа Блоха (ISBN-13: 978-0-321-35668-0) говорится, что для создания объектов лучше использовать шаблон построителя, чем соглашение о bean-компонентах.
Например (образец фасоли):
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
Использование с шаблоном построителя:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).
sodium(35).
carbohydrate(27).
build();
Реализация паттерна построителя:
// Builder Pattern
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
Когда требуются первые два аргумента.
Для проверки вы можете использовать раннюю проверку (в каждом методе <field>) или отложенную проверку (в методе build ()). И формат является своего рода инициализацией значения ключа и значения python.
Какое значение имеет метод сборки? Почему бы просто не остановиться на .carbohydrate ()?
Метод сборки возвращает объект NutritionFacts. Остальные возвращают Строителя. Вы можете написать что-то вроде этого: NutritionFacts n = new NutritionFacts.Builder (12, 15) .sodium (12) .build ();
См. Также stackoverflow.com/questions/2750/…