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

全栈网站开发工程师wordpress国内现状

全栈网站开发工程师,wordpress国内现状,公司网站建设价格,wordpress video.js这就是我开始撰写本文的方式。 我已经读过很多次这样的声明#xff1a; “当对象引用可变的最终字段时#xff0c;克隆变得很困难。” 每次我在Google上搜索它时#xff0c;都要了解它的确切含义#xff0c;并且在此过程中也忘了它。 因此以为我会在此撰写博客#xff0c;… 这就是我开始撰写本文的方式。 我已经读过很多次这样的声明 “当对象引用可变的最终字段时克隆变得很困难。” 每次我在Google上搜索它时都要了解它的确切含义并且在此过程中也忘了它。 因此以为我会在此撰写博客以便将其作为我的直接参考。 克隆对象我可以从我的研究生课程的OOP课程中回想起正在创建对象的类似副本该副本基本上应符合以下规则 x.clone x x.clone。getClass x.getClass x.clone。equalsx 请注意在所有情况下都必须始终满足条件1。 尽管条件2和3并非绝对要求但最好以这样的方式设计克隆方法使其保持良好状态。 在继续讨论之前这是Object类中clone方法的方法签名 protected native Object clone() throws CloneNotSupportedException; 因此正如您注意到protected修饰符一样我们不可能直接在任何对象上调用clone方法。 我们必须重写此方法作为公共方法并在我们的类中为其提供实现才能访问它。 如果不需要特定的实现我们可以返回super.clone。 由于在Java 5之后可以进行协变返回因此我们可以修改clone的返回值以返回类的对象。 因此如果我们正在编写员工类则这是clone方法的方式 Override public Employee clone() throws CloneNotSupportedException {return (Employee) super.clone(); } 但是请注意Object类中的clone方法检查我们的类是否实现Cloneable接口。 如果未实现则抛出CloneNotSupportedException。 否则它将创建一个新副本。 但是请注意克隆方法从不调用构造函数来创建对象的副本。 因此如果您想通过增加构造函数内部的静态计数器来跟踪为类创建的实例数量则此方法将不会起作用因为永远不会调用构造函数。 相反clone方法从对象内存中逐实例复制实例属性然后将其返回给调用方。 因此如果类必须提供一个用于克隆它的选项而不导致CloneNotSupportedException则必须实现该类的标记接口Cloneable。 但是请注意调用clone的代码应处理此异常。 否则会导致编译器错误。 是的这是一个痛点对此受到批评。 现在让我们举一个例子 案例1 public class Employee implements Cloneable{private String name;private String identifier;public String getName() {return name;}public void setName(String name) {this.name name;}public String getIdentifier() {return identifier;}public void setIdentifier(String identifier) {this.identifier identifier;}Overridepublic Employee clone() throws CloneNotSupportedException {return (Employee)super.clone();}public void print() {System.out.println(Objects.toStringHelper(this).add(name:, name).add(id:, identifier).toString());}public static void main(String[] args) throws CloneNotSupportedException {Employee employee1 new Employee();employee1.setName(Ram);employee1.setIdentifier(1);System.out.println(1: employee1);employee1.print();Employee employee2 employee1.clone();System.out.println(2: employee2);employee2.print();} } 这是此的输出 1: com.pramati.test.Employee19821f Employee{name:Ram, id:1} 2: com.pramati.test.Employeede6ced Employee{name:Ram, id:1} 从上面的示例可以看出clone方法创建了一个新Employee其值是从现有对象中复制的。 这很简单并且可以正常工作因为Employee类中没有对象引用。 让我们这样修改类 案例2 public class PayPackDetails{private double basicSalary 500000d;private double incentive 50000d;public double getSalary() {return getBasicSalary()getIncentive();}public double getBasicSalary() {return basicSalary;}public double getIncentive() {return incentive;}public void setBasicSalary(double basicSalary) {this.basicSalary basicSalary;}public void setIncentive(double incentive) {this.incentive incentive;} }public class Employee implements Cloneable {private String name;private String identifier;private PayPackDetails packDetails;public Employee(String name, String identifier, PayPackDetails packDetails) {this.name name;this.identifier identifier;this.packDetails packDetails;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getIdentifier() {return identifier;}public void setIdentifier(String identifier) {this.identifier identifier;}public PayPackDetails getPackDetails() {return packDetails;}Overridepublic Employee clone() throws CloneNotSupportedException {return (Employee)super.clone();}public void print() {System.out.println(Objects.toStringHelper(this).add(name:, name).add(id:, identifier).add(package:, packDetails.getSalary()).toString());}public static void main(String[] args) throws CloneNotSupportedException {Employee employee1 new Employee(Ram,1,new PayPackDetails());System.out.println(1: employee1);employee1.print();Employee employee2 employee1.clone();System.out.println(2: employee2);employee2.print();} } 运行main方法时我们将得到以下结果 1: com.pramati.clone.Employeeaddbf1 Employee{name:Ram, id:1, package:550000.0} 2: com.pramati.clone.Employeede6ced Employee{name:Ram, id:1, package:550000.0} 这可以。 现在说我们像这样修改了我们的主要方法 案例3 public static void main(String[] args) throws CloneNotSupportedException {Employee employee1 new Employee(Ram,1,new PayPackDetails());Employee employee2 employee1.clone();employee2.setName(Krish); employee2.setIdentifier(2);employee2.getPackDetails().setBasicSalary(700000d);employee1.print();employee2.print(); } 现在您认为employee1的薪水是多少 随着我们增加了克隆员工的薪水我们自然希望为他增加薪水。 但是这里出乎意料的转折是employee1的薪水也增加了。 这是输出或此 Employee{name:Ram, id:1, package:750000.0} Employee{name:Krish, id:2, package:750000.0} 请注意当我们克隆对象时不会调用构造函数。 宁愿对原始对象的地址位置中存在的所有成员变量进行逐域复制。 现在当有对象引用时该引用将被复制而不是原始对象。 因此原始对象和克隆对象都指向同一成员对象。 因此对一个对象所做的更改将自动对另一对象可见。 那么如何解决这个问题呢 最简单的解决方案是也为PayPackDetails实现克隆方法并从Employee的克隆方法中调用它。 情况4 Override public Employee clone() throws CloneNotSupportedException {Employee employee (Employee)super.clone();employee.packDetails packDetails.clone();return employee; } 现在运行main方法它将按预期给出正确的结果 Employee{name:Ram, id:1, package:550000.0} Employee{name:Krish, id:2, package:750000.0} 但是如果PayPackDetails由其他对象引用组成则我们也必须重写该对象的克隆方法并在PayPackDetails内部调用其克隆方法。 同样当我们在PayPackDetails中组成新对象时除了在新组成的对象中实现clone方法外我们还必须在PayPackDetails中修改clone方法。 组合对象类还应该实现Cloneable接口。 与往常一样我们还必须处理CloneNotSupportedException。 现在考虑将PayPackDetails声明为final的另一种情况这将使情况更加糟糕 情况5 public class Employee implements Cloneable {private String name;private String identifier;private final PayPackDetails packDetails;// -- Rest of the methods } 由于该字段被声明为final因此无法在clone方法中为其分配新值因为它被声明为final。 那么如何处理呢 解决方案如下使用复制构造函数并从克隆中返回新实例。 public class Employee implements Cloneable {private String name;private String identifier;private final PayPackDetails packDetails;public Employee(String name, String identifier, PayPackDetails packDetails) {this.name name;this.identifier identifier;this.packDetails packDetails;}protected Employee(Employee emp) throws CloneNotSupportedException{name emp.name;identifier emp.identifier;packDetails emp.packDetails.clone();}Overridepublic Employee clone() throws CloneNotSupportedException {return new Employee(this);}public void print() {System.out.println(Objects.toStringHelper(this).add(name:, name).add(id:, identifier).add(package:, packDetails.getSalary()).toString());} } 请注意复制构造函数访问修饰符受到保护。 现在问题来了为什么我们也不能将复制构造函数用于PayPackDetails而不是克隆方法 答案是是的我们可以使用它。 情况6 public class PayPackDetails {private double basicSalary 500000d;private double incentive 50000d;public PayPackDetails(PayPackDetails details){basicSalary details.getBasicSalary();incentive details.getIncentive();}public static void main(String[] args) {Employee employee1 new Employee(Ram,1,new PayPackDetails());employee1.print();Employee employee2 new Employee(employee1);employee2.print();} } public class Employee {private String name;private String identifier;private final PayPackDetails packDetails;protected Employee(Employee emp) {name emp.name;identifier emp.identifier;packDetails new PayPackDetails(emp.packDetails);}// .. Other methods} 到目前为止这是最好的情况这是此程序的输出 Employee{name:Ram, id:1, package:550000.0} Employee{name:Ram, id:1, package:550000.0} 实际上这是最好的方法因为它解决了有缺陷的克隆方法的许多问题 1.没有一个类必须实现标记接口Cloneable 2.由于不需要克隆因此无需捕获CloneNotSupportedException 3.由于不需要克隆因此无需在调用super.clone时对对象进行类型转换。 但是问题来了假设您有一个PayPackDetails的子类。 案例7 public class AdvancedPayPackDetails extends PayPackDetails {private double flexiblePayPercent 10d;public AdvancedPayPackDetails(AdvancedPayPackDetails details) {super(details);flexiblePayPercent details.getFlexiblePayPercentage();}Overridepublic double getSalary() {return super.getSalary()(getBasicSalary()*getFlexiblePayPercentage()/100);}public double getFlexiblePayPercentage() {return flexiblePayPercent;}public void setFlexiblePayPercent(double flexiblePayPercent) {this.flexiblePayPercent flexiblePayPercent;}public static void main(String[] args) throws CloneNotSupportedException {Employee employee1 new Employee(Ram,1,new AdvancedPayPackDetails());employee1.print();Employee employee2 employee1.clone();employee2.print();}} 现在运行main方法它将为我们提供输出 Employee{name:Ram, id:1, package:600000.0} Employee{name:Ram, id:1, package:550000.0} 原因很明显。 Employee的副本构造函数不知道创建的这个新类AdvancedPayPackDetails。 实际上我们可以修改Employee构造函数以包括对PayPackDetails的instanceOf检查但这不是正确的方法。 相反最好返回到我们先前的解决方案在最终字段的情况下使用复制构造函数并对具有继承层次结构的类使用克隆方法案例5的解决方案。 结论正如我们在本文中一直看到的那样以正确的方式实现克隆方法非常复杂。 因此最好尽量远离克隆。 只要复制对象没有任何继承层次结构最好使用复制构造函数。 参考 哪个更好的选择克隆或复制构造函数 来自我们的JCG合作伙伴 Prasanth Gullapalli位于prasanthnath博客上。 翻译自: https://www.javacodegeeks.com/2014/01/which-is-better-option-cloning-or-copy-constructors.html
http://www.zqtcl.cn/news/85061/

相关文章:

  • 怎么建设一个淘宝客网站谁知道下载教学设计的网站
  • 做搞机网站南京建设工程网站
  • 建立自己的网站怎么样做学习电子商务网站建设与管理的收获6
  • 佛山网站注册公司材料怎么准备
  • 做网站开发需要学那些东西最近国际新闻
  • 免费的资料网站如何建立电子商务网站
  • 专业做网站的技术人员wordpress后台爆破
  • 一个域名建多个网站外贸公司名称
  • 中小企业网站建设费用在线海报免费制作
  • 桥西区建设局网站上海中风险地区名单
  • 专业开发网站设计宁夏微信服务网站
  • 家政网站模板民宿网站开发的开题报告
  • 成都金融网站建设公司排名wordpress调用个人中心
  • 东莞 营销网站制作想做个外贸网站
  • 常宁做网站哪家建站公司好
  • php 企业网站管理系统深圳有哪几个区
  • 网站怎么做外链接四川住房和城乡建设部网站首页
  • 济源网站建设公司北京邢台企业商会网站
  • wordpress网站排名台州商城网站建设
  • 做旅游网站的写手网站举报在哪举报
  • 遵义公司网站搭建多少钱上海移动云网站建设
  • 北京网站建设付款方式个人网站设计结构图
  • 网站公司seo微信后台网站建设
  • 唐山网站专业制作上海模板建站源码
  • 杭州网站建设乐云seo模板中心织梦网站模板视频教程
  • 那里有学做网站的中专网站建设与管理就业前景
  • 北京网站开发工程师珠宝 网站欣赏
  • 台州做网站哪家公司好做app网站
  • 英文网站建设免费dwcc网站前台脚本怎么做音频
  • 做网站 租服务器吗单页推广网站模版