当前位置: 首页 > news >正文

孟村做网站价格公司取名字参考大全免费

孟村做网站价格,公司取名字参考大全免费,公司的企业文化怎么写,网站开发项目计划书ppt我将不深入讨论该模式#xff0c;因为已经有大量的帖子和书籍对此进行了详细的解释。 相反#xff0c;我将告诉您为什么以及何时应该考虑使用它。 但是#xff0c;值得一提的是#xff0c;这种模式与《 四人帮》一书中介绍的模式有些不同。 虽然原始模式着重于抽象化构造步… 我将不深入讨论该模式因为已经有大量的帖子和书籍对此进行了详细的解释。 相反我将告诉您为什么以及何时应该考虑使用它。 但是值得一提的是这种模式与《 四人帮》一书中介绍的模式有些不同。 虽然原始模式着重于抽象化构造步骤以便通过更改所使用的构建器实现可以得到不同的结果但本文中说明的模式用于消除不必要的复杂性该复杂性是由多个构造函数多个可选参数以及过度使用二传手。 假设您有一个包含大量属性的类例如下面的User类。 假设您要使该类不可变顺便说一句 除非有充分的理由不这样做否则您应该始终努力。 但是我们将在另一篇文章中讨论。 public class User {private final String firstName; //requiredprivate final String lastName; //requiredprivate final int age; //optionalprivate final String phone; //optionalprivate final String address; //optional ... } 现在想象一下您的类中的某些属性是必需的而其他属性是可选的。 您将如何构建此类的对象 所有属性都声明为final因此您必须在构造函数中全部设置它们但您也想让此类的客户端有机会忽略可选属性。 第一个有效的选择是拥有一个仅将必需属性作为参数的构造函数一个将所有必需属性加上第一个可选属性作为参数的构造函数而另一个将两个可选属性作为参数的构造函数依此类推。 看起来像什么 像这样 public User(String firstName, String lastName) {this(firstName, lastName, 0);}public User(String firstName, String lastName, int age) {this(firstName, lastName, age, );}public User(String firstName, String lastName, int age, String phone) {this(firstName, lastName, age, phone, );}public User(String firstName, String lastName, int age, String phone, String address) {this.firstName firstName;this.lastName lastName;this.age age;this.phone phone;this.address address;} 用这种方法构造类的对象的好处是它可以工作。 但是这种方法的问题应该很明显。 当您只有几个属性时没什么大不了的但是随着数量的增加代码变得更难以阅读和维护。 更重要的是对于客户而言代码变得越来越难。 我应该作为客户端调用哪个构造函数 一个带有2个参数 一个3 不传递显式值的那些参数的默认值是多少 如果我想为地址设置一个值而不是年龄和电话该怎么办 在那种情况下我将不得不调用接受所有参数的构造函数并为那些我不在乎的参数传递默认值。 此外具有相同类型的几个参数可能会造成混淆。 第一个String是电话号码还是地址 那么对于这些​​情况我们还有什么选择呢 我们总是可以遵循JavaBeans约定在该约定中我们有一个默认的no-arg构造函数并且每个属性都有设置器和获取器。 就像是 public class User {private String firstName; // requiredprivate String lastName; // requiredprivate int age; // optionalprivate String phone; // optionalprivate String address; //optionalpublic String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName lastName;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address address;} } 这种方法似乎更易于阅读和维护。 作为客户端我可以只创建一个空对象然后仅设置我感兴趣的属性。那么这有什么问题呢 该解决方案有两个主要问题。 第一个问题与使此类的实例处于不一致状态有关。 如果要创建一个具有其所有5个属性值的User对象则在调用所有setX方法之前该对象将不具有完整状态。 这意味着客户端应用程序的某些部分可能会看到此对象并假定该对象已经构造而实际上并非如此。 这种方法的第二个缺点是现在User类是可变的。 您失去了不可变对象的所有好处。 幸运的是对于这些情况还有第三种选择即构建器模式。 解决方案将如下所示。 public class User {private final String firstName; // requiredprivate final String lastName; // requiredprivate final int age; // optionalprivate final String phone; // optionalprivate final String address; // optionalprivate User(UserBuilder builder) {this.firstName builder.firstName;this.lastName builder.lastName;this.age builder.age;this.phone builder.phone;this.address builder.address;}public String getFirstName() {return firstName;}public String getLastName() {return lastName;}public int getAge() {return age;}public String getPhone() {return phone;}public String getAddress() {return address;}public static class UserBuilder {private final String firstName;private final String lastName;private int age;private String phone;private String address;public UserBuilder(String firstName, String lastName) {this.firstName firstName;this.lastName lastName;}public UserBuilder age(int age) {this.age age;return this;}public UserBuilder phone(String phone) {this.phone phone;return this;}public UserBuilder address(String address) {this.address address;return this;}public User build() {return new User(this);}} } 需要注意的几个要点 User构造函数是私有的这意味着不能从客户端代码直接实例化此类。 该类再次是不可变的。 所有属性都是最终属性它们是在构造函数上设置的。 此外我们仅为他们提供吸气剂。 构建器使用Fluent Interface惯用法使客户机代码更具可读性我们稍后将看到一个示例。 构建器构造函数仅接收必需的属性并且此属性是在构建器上唯一定义为“最终”的属性以确保在构造函数上设置其值。 生成器模式的使用具有我一开始提到的前两种方法的所有优点并且没有任何缺点。 客户端代码更易于编写更重要的是易于阅读。 我听到的关于该模式的唯一批评是您必须在构建器上复制类的属性。 但是考虑到构建器类通常是它构建的类的静态成员类因此它们可以很容易地一起进化。 现在尝试创建新的User对象的客户端代码如何 让我们来看看 public User getUser() {return newUser.UserBuilder(Jhon, Doe).age(30).phone(1234567).address(Fake address 1234).build();} 很整洁不是吗 您可以用1行代码构建一个User对象最重要的是它很容易阅读。 而且您要确保每当获得此类的对象时都不会处于不完整状态。 这种模式非常灵活。 通过在对“ build”方法的调用之间更改构建器属性可以使用单个构建器来创建多个对象。 构建器甚至可以自动完成每次调用之间生成的某些字段例如ID或序列号。 重要的一点是就像构造器一样构造器可以对其参数施加不变性。 构建方法可以检查这些不变量如果它们无效则抛出IllegalStateException 。 将参数从构建器复制到对象之后必须检查它们并在对象字段而不是构建器字段上检查它们这一点至关重要。 这样做的原因是由于生成器不是线程安全的因此如果我们在实际创建对象之前检查参数则可以在检查参数与复制参数之间的另一个线程更改它们的值。 该时间段称为“漏洞窗口”。 在我们的用户示例中这可能类似于以下内容 public User build() {User user new user(this);if (user.getAge() 120) {throw new IllegalStateException(“Age out of range”); // thread-safe}return user; } 以前的版本是线程安全的因为我们首先创建用户然后检查不可变对象上的不变量。 以下代码在功能上看起来相同但是它不是线程安全的因此应避免执行以下操作 public User build() {if (age 120) {throw new IllegalStateException(“Age out of range”); // bad, not thread-safe}// This is the window of opportunity for a second thread to modify the value of agereturn new User(this); } 这种模式的最后一个优点是可以将构建器传递给某个方法以使该方法能够为客户端创建一个或多个对象而该方法无需了解有关如何创建对象的任何种类的细节。 为此通常需要一个简单的界面例如 public interface Builder {T build(); } 在前面的User示例中 UserBuilder类可以实现Builder User 。 然后我们可能会有类似的内容 UserCollection buildUserCollection(Builder? extends User userBuilder){...} 好吧那是一篇相当长的第一篇文章。 综上所述对于具有多个参数的类不是一门精确的科学但我通常将4个属性用作使用该模式的一个很好的指标Builder模式是一个绝佳的选择尤其是当这些参数中的大多数是可选的。 您将获得易于阅读编写和维护的客户端代码。 此外您的类可以保持不变这使您的代码更安全。 更新 如果将Eclipse用作IDE事实证明您有很多插件可以避免该模式随附的大多数样板代码。 我见过的三个是 http://code.google.com/p/bpep/ http://code.google.com/a/eclipselabs.org/p/bob-the-builder/ http://code.google.com/p/fluent-builders-generator-eclipse-plugin/ 我没有亲自尝试过其中任何一个因此我无法真正做出明智的决定。 我认为其他IDE应该也存在类似的插件。 参考开发 人员实践中来自JCG合作伙伴 Jose Luis 的构建者模式 它应该是博客。 翻译自: https://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html
http://www.huolong8.cn/news/54830/

相关文章:

  • 台州专业做网站手机网站建站用哪个软件好
  • 舆情监控都有哪些内容上海关键词排名优化公司
  • 成品网站w灬源码在线看宁波免费网页制作模板
  • 国内谷歌网站SEO优化网站地图导出怎么做
  • 怎么做淘宝网站教程如何通过域名访问网站
  • 如何通过网站后台修改网站做百度收录比较好的网站
  • 医院网站asp手机网页传奇
  • 舟山网站建设代理电商设计英语
  • 天津市免费建站网站建设好后如何提交搜索引擎
  • 中国建设银行注册网站用户名怎么填自建网站支付问题
  • 宁晋网站建设公司网络运维工程师简历范文
  • 韩国美食网站建设目的新网网站空间
  • 网页翻译不了中文南昌快速排名优化
  • 增加网站外链wordpress菜单栏功能
  • 东莞做网站卓诚网络电子商务平台发展现状
  • 网站建设完成后怎么上传服务器需要个网站
  • 网站开发部职责锚文本外链网站
  • ppt免费下载的网站网站建设的合同条款
  • 江宁区住房和城乡建设局网站唐山网站建设优化
  • 建设公众号网站评分标准细则网站开发合同 下载
  • 街区网站建设的意义金坛做网站哪家好
  • 柳州网站建设柳州form e哪个网站做
  • 局网站建设工作绥化建设局网站
  • 商城网站建设的优点如何在手机上做微电影网站
  • 做网站的域名移动网站建设哪家快
  • 阿里云网站备案要多久厘米售卡站怎么做网站
  • 网站建设详细流程网站制作模板北京
  • 厦门市建设局网站咨询电话网站做浮动边框asp代码
  • 网站维护升级有什么网站是做投资的
  • 怎样给网站做后台网站服务器数据库