setter 方法是否必须有一个参数?通常,setter 方法接受一个参数作为对象的某一属性的值。如果我想首先测试依赖于另一个布尔参数的有效性,如果为 true,则首先验证,否则只需设置值,该怎么办?

我通过 ftp 服务器从客户端获取值。有时这些文件包含垃圾值。例如,电话号码如#3432838#9。因此,在设置值之前,我需要删除那些垃圾字符。我可以在 setter 方法中做到这一点吗?这是一个有效的方法吗?

提前谢谢大家!

编辑:

这是否有效:

public void setSomething(String strValue){ 
     if(checkValidity(strValue)){ 
         // set the value 
     } else { 
         // set the value to an empty string
     }  
  }
有帮助吗?

解决方案

在java bean框架模型中这是特别必要的,但一般来说不是强制性的。

当 setter 旨在“切换”某个值时,您可以使用不带参数的 setter。

void setCheck()

例如,可以将“check”布尔属性设置为 true。

因此,即使它不是 Java bean 意义上的“setter”,您也可以想象 setter 用于其他目的。

另外,根据 JavaBean 规范第 7 节,setter 可以具有 不止一个论点, ,例如索引属性(索引属性支持一系列值。每当读取或写入该属性时,您只需指定一个索引来标识您想要的值。)

void setter(int index, PropertyType value); // indexed setter
void setter(PropertyType values[]); // array setter

在你的情况下,一个有效的方法是 添加一个 运行时异常 到我们函数的签名。
这样,您就不会为已经调用 setter 的所有其他类进行任何不必要的编译时异常检查。

或者您可以将您的财产视为 受限财产 并添加非运行时异常。

需要受约束的属性设置方法来支持 PropertyVetoException。此文档提供给尝试更新的受约束属性的用户 否决。因此,一个简单的约束属性可能如下所示:

PropertyType getFoo();
void setFoo(PropertyType value) throws PropertyVetoException;

如果需要,它允许添加 VetoableChangeListener。


关于您的片段,它是“有效的”,但可能不是最佳的,因为(如 这个问题):

  • 验证应与 getter 或 setter 分开捕获 在验证方法中。这样,如果验证需要在多个组件之间重用,它是可用的。
  • 最好是 快速失败 (因此我建议向设置器添加例外)。

其他提示

通过Java Bean规范setter有一个参数。如果你添加另一个,无论出于何种原因,它不再被视为setter。

Setter完全有效<!>“;清理<!>”;它的参数,如果无效则抛出异常。

为什么不呢。验证和验证输入是包含在setter中的一个很好的变体。这里的问题是,如果你想允许设置成员而不进行验证。

对于您使用的某个框架(用作bean),您可能需要setter的标准形式。但如果你不受这种限制,你可以试试这个。

如果你认为其他代码应该进行验证但是错误值永远不应该设置,你也可以在setter中使用asserts。

在书中<!>“Effective Java 2nd Edition <!>”; Joshua Bloch(ISBN-13:978-0-321-35668-0)表示,最好使用构建器模式而不是对象创建的bean约定。

例如(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键值初始化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top