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

wordpress可以做下载站嘉定房产网

wordpress可以做下载站,嘉定房产网,免费装饰公司网站模板,包装回收网站建设尺度不变性是指什么不变因此#xff0c;在我的第一篇文章中#xff0c;我谈到了一些构建器模式#xff0c;并提到了一个非常强大但却被忽视的概念#xff1a;不变性。 什么是不可变类#xff1f; 这只是一个其实例无法修改的类。 类属性的每个值都在其声明或其构造函数中… 尺度不变性是指什么不变 因此在我的第一篇文章中我谈到了一些构建器模式并提到了一个非常强大但却被忽视的概念不变性。 什么是不可变类 这只是一个其实例无法修改的类。 类属性的每个值都在其声明或其构造函数中设置并且在对象的整个生命周期中保留这些值。 Java有很多不变的类例如String 所有装箱的原语 Double Integer Float等 BigInteger和BigDecimal等。 这有一个很好的理由不可变类比可变类更易于设计实现和使用。 一旦实例化它们它们只能处于一种状态因此它们不易出错并且正如我们在本文后面会看到的那样它们更加安全。 您如何确保类是不变的 只需遵循以下5个简单步骤 不要提供任何可修改对象状态的公共方法 也称为增变器例如setter。 防止扩展类 。 这不允许任何恶意或粗心的类扩展我们的类并损害其不变的行为。 这样做的通常且更简单的方法是将类标记为final 但是我将在本文中提及另一种方法。 将所有字段定为最终值 。 这是让编译器为您强制执行第1点的方法。 此外它清楚地使任何看到您的代码的人都知道您不希望这些字段在设置后更改其值。 将所有字段设为私有 。 无论您是否考虑了不变性这一点都应该很明显并且您应该遵循它 但是我只是为了以防万一。 永远不要提供对任何可变属性的访问 。 如果您的类具有一个可变对象作为其属性之一例如List Map或您的域问题中的任何其他可变对象请确保该类的客户端永远无法获得对该对象的引用。 这意味着您永远不要从访问器例如getter直接返回对它们的引用并且永远不要在构造函数中使用从客户端作为参数传递的引用来初始化它们。 在这种情况下您应该始终制作防御性副本。 有很多理论知识没有代码因此让我们看看一个简单的不可变类是什么样子以及它如何处理我之前提到的5个步骤 public class Book {private final String isbn;private final int publicationYear;private final List reviews;private Book(BookBuilder builder) {this.isbn builder.isbn;this.publicationYear builder.publicationYear;this.reviews Lists.newArrayList(builder.reviews);}public String getIsbn() {return isbn;}public int getPublicationYear() {return publicationYear;}public List getReviews() {return Lists.newArrayList(reviews);}public static class BookBuilder {private String isbn;private int publicationYear;private List reviews;public BookBuilder isbn(String isbn) {this.isbn isbn;return this;}public BookBuilder publicationYear(int year) {this.publicationYear year;return this;}public BookBuilder reviews(List reviews) {this.reviews reviews null ? new ArrayList() : reviews;return this;}public Book build() {return new Book(this);}} } 我们将在这个非常简单的课程中讲解重点。 首先您可能已经注意到我再次使用了构建器模式。 这不仅是因为我是它的忠实拥护者而且还因为我想说明一些我不想在之前的文章中没有首先对不变性概念有基本了解的观点。 现在让我们看一下我提到的5个步骤您需要遵循这些步骤使一个类不可变并查看它们是否对本书示例有效 不要提供任何修改对象状态的公共方法 。 请注意类上的唯一方法是其私有构造函数和其属性的获取器但没有更改对象状态的方法。 防止扩展类 。 这很棘手。 我提到确保这一点的最简单方法是将班级定为最终班但Book班显然不是最终班。 但是请注意唯一可用的构造函数是private 。 编译器确保没有公共或受保护的构造函数的类不能被子类化。 因此在这种情况下不需要在类声明中使用final关键字但是无论如何将其包括在内只是个好主意以使看到您代码的任何人都可以清楚地知道。 将所有字段定为最终值 。 非常简单该类上的所有属性都声明为final 。 永远不要提供对任何可变属性的访问 。 这实际上很有趣。 请注意Book类如何具有一个List String属性该属性被声明为final并且其值在类构造函数上设置。 但是此列表是可变对象。 也就是说虽然评论参考一旦设置便无法更改但列表的内容可以更改。 引用相同列表的客户端可以添加或删除元素结果在创建Book对象后更改其状态。 因此请注意在Book构造函数中我们不直接分配引用。 相反我们使用Guava库通过调用“ this.reviews Lists.newArrayList(builder.reviews); ”来复制列表this.reviews Lists.newArrayList(builder.reviews); ”。 在getReviews方法上可以看到相同的情况在该方法中我们返回列表的副本而不是直接引用。 值得注意的是此示例可能有点简化因为评论列表只能包含不可变的字符串。 如果列表的类型是可变的类那么您还必须复制列表中的每个对象而不仅仅是列表本身。 最后一点说明了为什么不可变的类导致更简洁的设计和更易于阅读的代码。 您只需共享那些不可变的对象而不必担心防御性副本。 实际上绝对不要制作任何副本因为对象的任何副本都将永远等于原始副本。 一个必然的结论是不变的对象只是简单的。 他们只能处于一种状态并且一生都保持这种状态。 您可以使用类构造函数检查所有不变量即需要在该类上有效的条件例如其属性之一的值范围然后可以确保这些不变量保持真实状态而无需付出任何努力您或您的客户。 不变对象的另一个巨大好处是它们本质上是线程安全的。 它们不能被同时访问对象的多个线程破坏。 到目前为止这是在应用程序中提供线程安全性的最简单且不易出错的方法。 但是如果您已经有一个Book实例并且想要更改其属性之一的值怎么办 换句话说您想要更改对象的状态。 在不可变的类上按照定义这是不可能的。 但是与软件中的大多数事情一样总有一种解决方法。 在这种情况下实际上有两个。 第一种选择是在Book类上使用Fluent Interface技术并具有类似于setter的方法这些方法实际上创建一个对象该对象的所有属性都具有相同的值但要更改的对象除外。 在我们的示例中我们将必须在Book类中添加以下内容 private Book(BookBuilder builder) {this(builder.isbn, builder.publicationYear, builder.reviews);}private Book(String isbn, int publicationYear, List reviews) {this.isbn isbn;this.publicationYear publicationYear;this.reviews Lists.newArrayList(reviews);}public Book withIsbn(String isbn) {return new Book(isbn,this.publicationYear, this.reviews);} 请注意我们添加了一个新的私有构造函数可以在其中指定每个属性的值并修改了旧的构造函数以使用新的构造函数。 此外我们添加了一个新方法该方法返回一个新的Book对象该对象具有我们想要的isbn属性值。 相同的概念适用于该类的其余属性。 之所以称为功能方法是因为方法无需修改即可返回对其参数进行操作的结果。 这与程序或命令式方法形成对比在方法式或命令式方法中方法将一个过程应用于其操作数从而更改其状态。 这种生成新对象的方法显示了不可变类的唯一真正缺点它们要求我们为所需的每个不同值创建一个新对象这会在性能和内存消耗方面产生可观的开销。 如果要更改对象的几个属性则会放大此问题因为在每个步骤中都将生成一个新对象并且最终会丢弃所有中间对象而仅保留最后一个结果。 我们可以在构建器模式的帮助下为多步操作提供更好的选择例如我在上一段中描述的操作。 基本上我们向构建器添加一个新的构造器该构造器采用一个已经创建的实例来设置其所有初始值。 然后客户端可以以通常的方式使用构建器来设置所有所需的值然后使用build方法来创建最终对象。 这样我们避免只使用我们需要的某些值来创建中间对象。 在我们的示例中此技术在生成器方面看起来像这样 public BookBuilder(Book book) {this.isbn book.getIsbn();this.publicationYear book.getPublicationYear();this.reviews book.getReviews(); } 然后在我们的客户上我们可以 Book originalBook getRandomBook();Book modifiedBook new BookBuilder(originalBook).isbn(123456).publicationYear(2011).build(); 现在显然构建器不是线程安全的因此您必须采取所有通常的预防措施例如不与多个线程共享构建器。 我提到过这样一个事实即我们必须为状态的每个更改都创建一个新对象这可能会增加性能这是不可变类的唯一真正的缺点。 但是对象创建是JVM不断改进的方面之一。 实际上除特殊情况外对象创建比您想象的要高效得多。 无论如何提出一个简单明了的设计通常是一个好主意然后仅在进行测量后才重构性能。 在尝试猜测代码花费大量时间的十分之九的时间中有九次会发现自己错了。 此外不变对象可以自由共享而不必担心后果这一事实使您有机会鼓励客户端尽可能重用现有实例从而大大减少了创建对象的数量。 一种常见的方法是为最常见的值提供公共静态最终常量。 此技术在JDK上大量使用例如在Boolean.FALSE或BigDecimal.ZERO中 。 总结一下这篇文章如果您想从中学到一些东西那就这样吧 除非有充分的理由使它们可变否则类应该是不可变的 。 不要为每个类属性自动添加设置器。 如果出于某种原因您绝对不能使您的类不可变那么请尽可能限制其可变性。 一个对象可以处于的状态越少就越容易考虑该对象及其不变量。 并且不必担心不变性的性能开销很有可能您不必担心它。 参考 JCG合作伙伴 Jose Luis在开发上的 不变性的来龙去脉 。 翻译自: https://www.javacodegeeks.com/2013/01/the-ins-and-outs-of-immutability.html尺度不变性是指什么不变
http://www.zqtcl.cn/news/543352/

相关文章:

  • 南京公司网站模板建站网页制作中的网站维护
  • 微信分享 淘宝网站 怎么做wordpress访问慢
  • 网站后台制作沈阳营销型网站制作技术
  • 微页制作平台网站建设wordpress文章显示数量
  • 望野古诗王绩seo优化系统
  • 网站设计大概流程惠城区龙丰街道
  • 游戏平台十大排名南宁seo优化公司
  • 佛山外贸网站建设方案企业管理控制系统
  • 分类信息网站如何做排名品牌建设卓有成效
  • 企业网站报价方案模板下载营销软件crm
  • 湛江网站开发哪家专业东莞营销型手机网站建设
  • 做个外贸的网站不懂英语咋做做网站 嵌入支付
  • 官方模板关键字生成的代码添加在网站的什么地方?网站 建设 培训 视频
  • 做网站时图片要切片有什么作用网站导航栏模板怎么做
  • 网站做数据分析网站开发为什么不用cgi了
  • 有了网址可以建网站吗软件外包项目网站
  • 威海设计网站的单肩包自定义页面设计模板
  • 制作一个网站首页中国建设个人网上银行官网
  • 厦门开发网站公司购买手表网站
  • 网站模板排名vs做网站加背景
  • 思途旅游网站建设系统郴州新网招聘
  • 婚庆公司网站模板下载海域装饰
  • 微信小程序是干什么用的永康网站优化
  • 网站seo是什么谷歌海外广告投放
  • 江苏省 建设 注册中心网站首页淮南建筑网
  • 网站备案核wordpress页面菜单
  • 凤阳县城乡建设局网站设计本app下载
  • 网站建设实用教程网站后台制作表格
  • 微信官方网站注册新开的网页游戏平台
  • 福州专业建站网站代码的重点内容是什么