Java 公共财产不好的现实例子
我无数次地读到,类上的公共属性是一个主要的失礼行为,但我不明白为什么在未进行转换的数据上进行输入/输出 我要写的东西的例子Java 公共财产不好的现实例子,java,oop,conventions,Java,Oop,Conventions,我无数次地读到,类上的公共属性是一个主要的失礼行为,但我不明白为什么在未进行转换的数据上进行输入/输出 我要写的东西的例子 public class Employee { public String firstName; public String lastName; private int ssn = 0; public boolean setSsn(String s) { //makes perfect sense why someth
public class Employee
{
public String firstName;
public String lastName;
private int ssn = 0;
public boolean setSsn(String s)
{
//makes perfect sense why something like an ssn would use a getter setter
//some code to validate ssn
if(!validSsn(s)){
ssn = 0;
return false;
}
ssn = raw;
return true;
}
public String getSsn()
{
return ssn;
}
private boolean validSsn(String s)
{
//validation goes here
retrun val;
}
//I don't understand why I should make firstName private
// and then write
public void setFirstName(String s)
{
firstName = s;
}
public String getFirstName(String s)
{
return firstName;
}
}
请提供一个场景,其中这将导致问题,请具体说明,而不是“因为其他人使用您的代码时它会导致问题”为什么?为什么会引起问题。提前感谢您的建设性批评和详细回答:D假设您的代码已经投入生产。我编写了一个前端,使用直接访问
firstName
和lastName
的Employee类
6个月过去了,现在有一个新的业务需求,您需要向名称字段添加验证
你打算在哪里添加它?你必须将字段设置为私有并添加set方法,这将迫使我和其他使用你的代码的人重新编写我们的应用程序
如果您首先正确封装了这些数据,那么我们所要做的就是使用新版本的库和您的代码重新编译。想象一下,您的代码已经投入生产。我编写了一个前端,使用直接访问
firstName
和lastName
的Employee类
6个月过去了,现在有一个新的业务需求,您需要向名称字段添加验证
你打算在哪里添加它?你必须将字段设置为私有并添加set方法,这将迫使我和其他使用你的代码的人重新编写我们的应用程序
如果您首先正确地封装了该数据,那么我们所要做的就是使用新版本的库和您的代码重新编译。如果您想在设置firstName时对其进行错误检查,该怎么办?或者在设置后将其锁定。您的set方法中没有任何这种逻辑,因此您的示例不需要它,但在某些情况下,您可能需要这种逻辑。
employee.firstName=“\n”不是公共属性不好,而是公共字段破坏了封装,允许在类不知情的情况下更改数据。如果您不关心字段中的值,那也没什么大不了的。但是,如果您依赖于它们,或者在其他方法中具有某些值,则无法使用字段强制执行该操作。除了@FelixCastor所说的,您可能不需要检查字段值。。。现在但是如果您需要在以后的版本中检查它呢?:)@assylias-今天的普通setter可以在明天更改,而不会影响外部调用方。公共字段不能为空。它们在Java中是不等价的。如果您想在设置firstName时对其进行错误检查,该怎么办?或者在设置后将其锁定。您的set方法中没有任何这种逻辑,因此您的示例不需要它,但在某些情况下,您可能需要这种逻辑。employee.firstName=“\n”不是公共属性不好,而是公共字段破坏了封装,允许在类不知情的情况下更改数据。如果您不关心字段中的值,那也没什么大不了的。但是,如果您依赖于它们,或者在其他方法中具有某些值,则无法使用字段强制执行该操作。除了@FelixCastor所说的,您可能不需要检查字段值。。。现在但是如果您需要在以后的版本中检查它呢?:)@assylias-今天的普通setter可以在明天更改,而不会影响外部调用方。公共字段不能为空。它们在Java中不是等价的。谢谢,这回答了我的问题。然而,您不需要捕获新的异常吗?当然,您可以避免更改“setFirstName()”语句,但是如果名称无效,您将如何处理它?为什么Java不能有C风格的get/set:'(您可以添加回退机制,例如,在出现错误时不设置字段。无论回退是什么,使用setter和getter都可以提供更大的灵活性,因为您实际上将逻辑隐藏在类中,并提供一个干净、漂亮的接口。公共字段很难看。@Jessedam,因为您已经对其进行了验证在ssn字段中,我假设我已经放置了一个常规的“catch exception,display error,re prompt user”机制到位。不能保证我不必再次接触代码,但适当的封装只需要很少的努力就可以在代码中加入相当数量的未来证明。@Hafnernus缺乏未来证明能力?当然,但你不敢说它们难看!每次我需要简单数据时调用方法真的很难看。请使用ee.setFirstName(“Dave”)--我可以习惯于它与employee.firstName=“Dave”--仍然认为它更干净| | | | | | |打印(employee.firstName)--干净,最小与打印(employee.getFirstName())这就是我要说的hate@JesseAdam这是个人的喜好,我会告诉你。个人在使用C++的时候,有时我会写数据结构,这些数据结构只是数据容器。在这种情况下,我会用你的方法,主要是因为我懒惰,而且速度很快。但是一旦这个类实际用了一些参数,我就用GETE。由于上述原因,在代码大小方面,通过get/set访问数据并不比直接使用字段更费劲。谢谢,这回答了我的问题。但是,您不需要捕获新的异常吗?当然,您应该避免更改“setFirstName()”语句,但如果名称无效,您将如何处理它?为什么Java不能使用C风格的get/set:'(您可以添加回退机制,例如,在出现错误时不设置字段。无论回退是什么,使用setter和getter都可以提供更大的灵活性,因为您实际上将逻辑隐藏在类中,并提供一个干净、漂亮的接口。公共字段很难看。@Jessedam,因为您已经对其进行了验证ssn字段,我假设我已经输入了一个通用的“ca”