我可以在setter方法中编写验证逻辑吗?

Mac*_*Mac 13 java oop encapsulation

setter方法是否仅用于设置属性的值,因为它作为参数传递?在将值赋给属性之前,我们可以编写一些验证逻辑吗?

Jer*_*vel 21

是的,验证逻辑绝对可以接受.

应该注意的是,如果您有广泛的验证,您可能希望将其提取到特定的验证器服务.但是对于简单的验证,您可以安全地执行此操作.

使用getter和setter背后的整个想法是没有人可以直接访问你的字段.如果你只是想设置/获取值,你可以制作它们public.

相反,我们使用setter来验证传入的数据,看它是否符合我们设置的规则.

这个概念也称为"封装",是面向对象编程的基石.


Bal*_*duz 8

是的,您可以在分配值之前在setter属性中添加验证逻辑.实际上,如果可能会将不需要的值发送给setter,则必须执行此操作.


hal*_*lei 7

实际上鼓励验证输入(检查它是否适合您的数据抽象)到您的setter方法,所以是的,您可以.


Dro*_*out 6

当然.您可以包含验证.这是可以接受的,但不是必要的.您只需要考虑如果您不验证它,那么任何值都将尝试设置为变量(满足数据类型要求).

基本上如果你有

public void setNickname(String nick)
{
    this.nickname = nick;
}
Run Code Online (Sandbox Code Playgroud)

并且你想要验证它,你可以在setter中做到 - 例如

public void setNickname(String nick)
{
    if(nick.matches("[a-zA-Z]+"){ // only letters
        this.nickname = nick;
    }else{
        // react
    }
}
Run Code Online (Sandbox Code Playgroud)

或者在使用它之前在制定者之外

if(nick.matches("[a-zA-Z]+"){ // only letters
    account.setNickname(nick);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用方法来验证它甚至是单独的验证器类.有很多可能性.

你不必害怕开发人员对此感到眼花缭乱,就像有人说的那样.

  • 如果您想从2个不同的地方设置昵称怎么办?你会重复验证吗? (2认同)

NPE*_*NPE 5

当然,让setter只接受有效值是没有错的.