范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

华为技术专家教你重构代码将值对象改为引用对象

  动机
  一个数据结构中可能包含多个记录,而这些记录都关联到同一个逻辑数据结构。例如,我可能会读取一系列订单数据,其中有多条订单属于同一个顾客。遇到这样的共享关系,既能将顾客信息作为值对象看待,也能将其视为引用对象: 若将其视为值对象,则每份订单数据中都会复制顾客的数据 若将其视为引用对象,对于一个顾客,就只有一份数据结构,会有多个订单与之关联
  若顾客数据永不修改,则两种方式都合理。 把同一份数据复制多次可能会造成一点困扰,但这种情况也
  很常见,不是太大问题。过多的数据复制有可能会造成内存占用的问题,但就跟所有性能问题一样,这种情况并不常见。
  若共享的数据需要更新,将其复制多份的做法就会遇到巨大困难。此时我必须找到所有副本,更新所有对象。漏掉一个副本没更新,就会导致数据不一致。这时,考虑将多份数据副本变成单一的引用,这样对顾客数据的修改就会立即反映在该顾客的所有订单中。
  把值对象改为引用对象会带来一个结果:对于一个客观实体,只有一个代表它的对象。这通常意味着我会需要某种形式的仓库,在仓库中可以找到所有这些实体对象。只为每个实体创建一次对象,以后始终从仓库中获取该对象。 做法
  为相关对象创建一个仓库(若还没这样的一个仓库)。 确保构造器有办法找到关联对象的正确实例。修改宿主对象的构造器,令其从仓库中获取关联对象。每次修改后测试。 案例
  订单Order类,其实例对象可从一个JSON文件创建。用来创建订单的数据中有一个顾客(customer)ID,我们用它来进一步创建Customer对象。  package com.javaedge.refactor.ttt;    import lombok.AllArgsConstructor;  import lombok.Getter;    import java.math.BigDecimal;  import java.util.Objects;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  public class Order {            private Customer customer;        public Order(String customerName) {          customer = new Customer(customerName);      }        public String getCustomerName() {          return customer.getName();      }        void setCustomerName(String customerName) {          customer = new Customer(customerName);      }    }
  此外,还有一些代码也会使用 *Customer* 对象;  package com.javaedge.refactor.ttt;    import lombok.Getter;    import java.util.Collection;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  public class Order {        private Customer customer;        public Order(String customerName) {          customer = new Customer(customerName);      }        public String getCustomerName() {          return customer.getName();      }        void setCustomerName(String customerName) {          customer = new Customer(customerName);      }        private static int numberOfOrdersFor(Collection orders, String customer) {          int result = 0;            for (Order each : orders) {              if (each.getCustomerName().equals(customer)) {                  result++;              }          }          return result;      }  }
  到目前为止,Customer对象还是值对象。就算多份订单属于同一客户,但每个 *Order* 对象还是拥有各自的 *Customer* 对象。我希望改变这现状,使得一旦同一客户拥有多份不同订单,代表这些订单的所有 *Order* 对象就能共享同一个Customer对象。本例中,就意味着: 每 一个客户名称只该对应一个Customer对象。
  首先我使用  Replace Constructor with Factory Method ,控制  *Customer* 对象的创建过程。我在 *Customer* 中定义工厂方法:  package com.javaedge.refactor.ttt;    import lombok.AllArgsConstructor;  import lombok.Getter;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  @AllArgsConstructor  class Customer {        private String name;        public static Customer create(String name) {          return new Customer(name);      }  }
  然后把原本调用构造函数的地方改为调用工厂函数:
  然后再把构造函数声明为private:  package com.javaedge.refactor.ttt;    import lombok.AllArgsConstructor;  import lombok.Getter;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  class Customer {        private String name;        private Customer(String name) {          this.name = name;      }        public static Customer create(String name) {          return new Customer(name);      }  }
  现在,我必须决定如何访问Customer对象。我比较喜欢通过另一个对象(例如Order中的一个字段)来访问它。但本例并没有这样一个明显的字段用于访问Customer对象。
  这时,我通常会创建一个注册表对象来保存所有Customer对象,以此作为访问点。简化例子,我把这个注册表保存在Customer类的static字段中,让Customer类作为访问点:
  然后我得决定: 在接到请求时,创建新的Customer对象 还是预先将它们创建好
  这里我选择后者。在应用程序的启动代码中,先把需要使用的Customer对象加载妥当。这些对象可能来自数据库,也可能来自文件。简单起见,我在代码中明确生成这些对象。反正以后我总是可以使用Substitute Algorithm改变它们的创建方式。  package com.javaedge.refactor.ttt;    import lombok.AllArgsConstructor;  import lombok.Getter;    import java.util.Dictionary;  import java.util.HashMap;  import java.util.Map;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  class Customer {        private String name;        private static Map instances = new HashMap<>();            private Customer(String name) {          this.name = name;      }        public static Customer create(String name) {          return new Customer(name);      }        static void loadCustomers() {          new Customer("Java").store();          new Customer("Edge").store();          new Customer("公众号").store();      }        private void store() {          instances.put(this.getName(), this);      }  }
  修改工厂函数,让它返回预先创建好的Customer对象  package com.javaedge.refactor.ttt;    import lombok.AllArgsConstructor;  import lombok.Getter;    import java.util.Dictionary;  import java.util.HashMap;  import java.util.Map;    /**   * @author JavaEdge   * @date 2022/4/1   */  @Getter  class Customer {        private String name;        private static Map instances = new HashMap<>();        private Customer(String name) {          this.name = name;      }        public static Customer create(String name) {          return instances.get(name);      }        static void loadCustomers() {          new Customer("Java").store();          new Customer("Edge").store();          new Customer("公众号").store();      }        private void store() {          instances.put(this.getName(), this);      }  }
  由于create()总是返回既有的Customer对象,所以我应该使用Rename Method修改这个工厂函数的名称,以便强调这点:  public static Customer getNamed(String name) {    return instances.get(name);  }

吃完火锅后感觉头晕,想往桌子下面钻去,啥情况呢?最近刷了个视频看到一个男孩因煤气中毒,导致成了植物人。看后我感触很深。不由得想起我本人亲身经历过的一次真实感实,希望也能警醒朋友们,对你也许有帮助。这件事具体是哪一年我没记住,大概比亚迪工厂员工待遇怎么样呢?看到这个图着实被惊呆了!比亚迪工厂员工待遇怎么样呢?看到这个图着实被惊呆了!近日,一张比亚迪安徽无为工厂招聘图片火了,其中管理类总经理(本科)工资月收入可达到30000元,其它管理类岗位也都有100002开放生态,宝德自强鲲鹏创造行业价值合力新基建推动下,以鲲鹏为代表的多样性计算发展不断深化,深刻改变着产业数字化进程。这其中,宝德自强鲲鹏生态是多样性计算能够快速扩大和渗透的主要推动力。一方面,凭借性能部署等方面的优势,宝德自强PT620Q火爆出圈的背后,隐藏着哪些硬实力?夏日炎炎,全芯启航,宝德自强PT620Q新品来袭!在接连两日的功能大揭秘后,宝德自强PT620Q迅速出圈,而这背后又隐藏着哪些硬实力呢?我们一起来看看吧!简而言之,宝德自强PT62亮点抢先看!宝德将携多款新品重磅亮相第十八届CPSE安博会宝德计算机系统股份有限公司已确认参展2021第十八届CPSE安博会(展位号1D52),即将展示智能安防领域相关产品与解决方案,欢迎莅临参观。宝德计算机2021年研发的智能安防领域新爆料!揭秘专精特新小巨人宝德的致胜之道不久前,在工业和信息化部公布的第二批专精特新小巨人企业名单中,宝德计算机系统股份有限公司荣耀上榜!根据工信部的定义,专精特新是指具有专业化精细化特色化新颖化的中小企业,它们专注主业坚持自主技术把好云端安全门,宝德云乘大势而崛起科技是国家强盛之基,创新是民族进步之魂。科技创新自立自强,历来都在国家发展社会进步中发挥着重要作用。一个现代化的中国离不开科技创新的支撑。党的十九届五中全会指出坚持创新在我国现代化更轻更强更全能,宝德轻薄笔记本M15清凉上市这个夏天有点燥!又热又长又无聊宝德给您带来降暑好礼!更轻更强更全能宝德轻薄笔记本M15清凉上市,让您在这个夏天HI玩到爽!全新上市的宝德轻薄笔记本M15,设计简约性能卓越功能齐全长大金融攻防两全,估值错位显配置价值,大金融行业投资逻辑梳理摘要本文梳理大金融板块的持仓情况以及各自的基本逻辑。前文针对近期市场表现梳理过共性逻辑,进入四季度,可更加重视估值的切换。而大金融由于估值和市场估值之差过大,无论是从悲观的角度还是缺芯影响渐趋缓和!这个板块Q4预期或迎改善如昨日所述,当下市场生态还没完全恢复。稍有风吹草动就会引来砸盘。下跌远比上涨来的容易。慢牛信仰不变,但市场自我修复恢复需要一个过程。短线可以参与,但要注意仓控。方向上依旧看新能源化糖价上涨持续,糖业公司将迎业绩拐点摘要偏强的宏观环境边际利好的基本面以及高亢的市场情绪决定了纽约原糖价格易涨难跌。在低成本库存逐渐被消化以后,高成本将逐渐在价格上得到反映,配额外进口成本高对国内糖价的拉动作用得到显
什么样的客厅灯是好的?,点缀靓装,夜晚给你一个明亮舒心的家大家好,这里是灯圈,只讲LED灯圈的事。入行多年来,凭借自己的经验,小编敢这样说90的朋友在家庭装修的时候,有关灯具知识的储备,少之又少,所以往往都只是选择了一款能亮的灯具。但是大晚上10点回到家,做舒服的事,哪件家电作用大?这里是灯圈,这里讲有关LED产品。忙碌的社会,好像现在的我们连日升而作,日落而息的境界都没了。早上闹钟把我们摇醒,晚上看着窗外的霓虹,拖着劳作一天的身体,打卡下班。回到家里的时光,收藏!每年游客不断,难道三亚真的那么完美吗?国内这段时间,关注旅游的朋友忽然一下增加了很多,这其中的原因想必大家也都知道什么蚊子是养的宠物旅馆好评自己刷上个厕所都要收费一下子全国很多旅游景点的各种话题也是不断,今天我们来看一注意!如今到哈尔滨喝啤酒,记得要冰镇的!别问我怎么知道的?哈尔滨你的印象是什么?冷!冰!对的冰城哈尔滨,是目前国内较为热门的旅游城市之一,同时也是国际冰雪文化名城!每年的冰雕展都会吸引来大批的游客来这里一睹风采!今天的哈尔滨已经是冰雪满天开灯关灯全靠喊,人到底可以懒到什么程度?这里是灯圈,这里只讲LED产品。懒人的智慧,最早是在上小学的时候听到的。在后来的成长过程中,所见所闻,也都诠释了这个理论的合理性。社会的进步,是科技代替人工输出的表象,随着科技的快航拍下,万州太安万亩油菜花显得格外惹眼,游客成群!旅行,既是为了追寻远方的美丽风景,也是为了遇见更好的另一个自己。旅行,我们一直在路上,有意的话,我们一起吧。眼下时节正是各种花,刚开始开放的时候,但是这里的油菜花已经开的很旺了,游中国前5大古村,原滋原味的生活文化,真正的世外桃源古村代表着中国人的居住理想和生活态度,还代表的是原滋原味的活生生的文化,它们传承着丰富的历史信息,具有重要的历史文化旅游等等价值。1hr宏村它位于安徽,用一句话形容就是牛形布局画里2021年广州建材博览会,分馆数十个,哪个展馆最热闹?大家好,这里是灯圈,这里只讲LED产品2021年广州建材博览会到今天7月24号就已经圆满结束了,那么作为打造大家居建装行业全球第一展的建博会此次突出的亮点是什么呢?拥挤的观众疫情之这个小城到俄罗斯只需10分钟,中国人免签,被称作中俄之窗旅行,既是为了追寻远方的美丽风景,也是为了遇见更好的另一个自己。旅行,我们一直在路上,有意的话,我们一起吧。大家好这里是旅游时间。这个小镇是南方的小伙伴很期望去的一个地方,只是想体太行有八陉,河南有其三,你听过吗?太行山是我国东部地区的重要山脉和地理分界线,而河南位于我国第二和第三阶梯的过渡地带,浩瀚绵延的太行山在这里留下了她最美的身段。可能有朋友听过太行山有八陉,分别为君都陉浦阴陉飞狐陉井ampampquot伴睡良品ampampquot,起夜不影响宝宝睡眠,自动感应亮灯,生活太方便被忽略的LED产品在LED下游产品矩阵中,LED小夜灯算得上是最小的产品单元了,也正是因为此,产品货值不高,大部分的朋友们也算是真的没有注意到这个产品的存在。不过,LED小夜灯可以