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

域名到期对网站的影响南宁网站设计报价

域名到期对网站的影响,南宁网站设计报价,网络营销策略和方法,电子商务网站建设选择来源#xff1a;https://blog.dogchao.cn/?p70《Effective JavaJava》名著#xff0c;必读。如果能严格遵从本文的原则#xff0c;以编写API的质量来苛求自己的代码#xff0c;会大大提升编码素质。以下内容只记录了我自己整理的东西#xff0c;还是建议读原文。为了聚焦… 来源https://blog.dogchao.cn/?p70《Effective JavaJava》名著必读。如果能严格遵从本文的原则以编写API的质量来苛求自己的代码会大大提升编码素质。以下内容只记录了我自己整理的东西还是建议读原文。为了聚焦知识点一些说明故意忽略掉了。相当于是一篇摘要。1、考虑用静态工厂方法替代构造函数例子Integer.valueOf(“1”)、Boolean.valueOf(“true”)等。 优势可读性高方法名性能不一定创建对象灵活性高下面针对三个优势进行一些解读。可读性高new Point(x,y)和Point.at(x,y)、Point.origin()。构造函数只能看出两个参数不知其意后者更易理解。性能在某些情况下可以事先进行实例化一些对象调用时直接调用即可不需要进行改变。比如Boolean。public final class Boolean implements Serializable, ComparableBoolean {// 预先设置两个对象public static final Boolean TRUE  new Boolean(true);public static final Boolean FALSE  new Boolean(false);public Boolean(boolean var1) {this.value  var1;}public Boolean(String var1) {this(parseBoolean(var1));}// 工厂方法public static Boolean valueOf(boolean var0) {return var0?TRUE:FALSE;    // 返回预先设置的对象而不是创建对象}// 工厂方法public static Boolean valueOf(String var0) {return parseBoolean(var0)?TRUE:FALSE;}// ... other code } 灵活性高可根据具体情况返回子类。相当于更强大的工厂。直接从父类获取到子类。尤其适用于工具类提供各种API。例子Collections。public class Collections {// 私有典型工厂private Collections() {}public static final List EMPTY_LIST  new EmptyList();// 工厂方法public static final T ListT emptyList() {return (ListT) EMPTY_LIST;}private static class EmptyListE extends AbstractListE implements RandomAccess, Serializable {// code}// 工厂方法public static E ListE checkedList(ListE list, ClassE type) {// 根据具体情况获取相应子类return (list instanceof RandomAccess ?new CheckedRandomAccessList(list, type) :new CheckedList(list, type));}// 子类1static class CheckedRandomAccessListE extends CheckedListE implements RandomAccess {CheckedRandomAccessList(ListE list, ClassE type) {super(list, type);}public ListE subList(int fromIndex, int toIndex) {return new CheckedRandomAccessList(list.subList(fromIndex, toIndex), type);}}// 子类2static class CheckedListE extends CheckedCollectionE implements ListE {// code} } 2、多个构造函数时考虑使用构造器尤其在进行Android开发时会碰到这种情况。通常是一个对象具有多个成员变量可能需要初始化常规方法需要提供大量构造函数。例如// 非Android中的AlertDialog便于说明问题举个例子 public class AlertDialog {private int width;private int height;private String title;private String confirmText;private String denyText;private AlertDialog(){}public AlertDialog(int width, int height){    // 空白的警告框AlertDialog(width,height,null);}// 带标题的警告框public AlertDialog(int width, int height, String title){    // 带标题的警告框AlertDialog(width, height, title, 确定);}// 带标题的警告框有确定按钮public AlertDialog(int width, int height, String title, String confirm){   AlertDialog(width, height, title, confirm, null);}// 带标题的警告框有确定按钮取消按钮public AlertDialog(int width, int height, String title, String confirm, String denyText){// set every thing.} } 有多种样式的警告框为了调用方便必须提供多个构造函数。否则用户在调用时只能使用完整构造函数容易犯错且无法进行阅读。极不灵活。如果采用另外一种方式则可以解决但会花费很多经历处理并发的情况:// 非Android中的AlertDialog便于说明问题举个例子 public class AlertDialog {private int width;private int height;private String title;private String confirmText;private String denyText;public AlertDialog(){}// 空白的构造函数public void setWidth(int width){this.width  width;}// 其他set方法 } 调用时通过调用各个参数的set方法进行设置。问题来了并发无法进行参数校验。例如只创建了对象设置了标题却没有尺寸相当于创建了一个没有尺寸的警告框。在Android中大量的控件都使用了构造器Builder。// 非Android中的AlertDialog便于说明问题举个例子 public class AlertDialog {private int width;private int height;private String title;private String confirmText;private String denyText;// privateprivate AlertDialog(){}// Builder中使用protected AlertDialog(Builder b){width  b.width;height  b.height;// .....if(width0||height0) throws new Exception(size must be set);}// 构造器public static class Builder {private int width;private int height;private String title;private String confirmText;private String denyText;// 注意返回的Builder。public Builder setTitle(String title) {this.title  title;return this;}// 其他set...public AlertDialog build(){return AlertDialog(this);}} } 于是可以根据相应需求进行相应设置并在AlertDialog真正构造时进行参数校验。就像这样new AlertDialog.Builder().setTitle(提示).build(); 上述例子会成功抛出异常。3、用私有化构造器或者枚举型强化Singleton。Singleton指最多会被实例化一次的类。通常情况下以前的做法是没有问题的。但是在某些高级情况通过使用反射的相关知识访问private的构造函数破坏Singleton。public class Elvis{// 注意公有final对象public static final Elvis INSTANCE  new Elvis();private Elvis(){} } 另一种情况在序列化的过程中反序列化得到的对象已经不再是以前的对象破坏了Singleton这种情况下可以通过单元素枚举型处理。public enum Elvis{INSTANCE;// some methods } 4、通过私有化构造器强化不可实例化的能力有一些工具类仅仅是提供一些能力自己本身不具备任何属性所以不适合提供构造函数。然而缺失构造函数编译器会自动添加上一个无参的构造器。所以需要提供一个私有化的构造函数。为了防止在类内部误用再加上一个保护措施和注释。public class Util{private Util(){// 抛出异常防止内部误调用throw new AssertionError();} } 弊端是无法对该类进行继承子类会调用super()。5、避免创建不必要的对象对象的重用昂贵的对象使用对象池廉价的对象慎用对象池。现代JVM对廉价对象的创建和销毁非常快此时不适于使用对象池。6、消除过期的对象引用以下三种情况可能会造成内存泄露自己管理的内存数组长度减小后pop出的对象容易导致内存泄漏缓存监听和回调自己管理的内存对于自己管理的内存要小心比如public class Stack{private Object[] elements;private int size  0;private static final int DEFAULT_INITIAL_CAPACITY  16;public Stack(){elements  new Object[DEFAULT_INITIAL_CAPACITY];}public void push(Object e){ensureCapacity();elements[size]e;    // allocate新的堆内存和栈内存}public Object pop(){if(size0) throw new EmptyStackException();return element[--size];    // pop出element[size]该对象不再有效。内存泄漏原因。}private void ensureCapacity(){if(elements.lengthsize)elements  Arrays.copyOf(elements, 2*size1);} } 弹出的对象不再有效但JVM不知道所以会一直保持该对象造成内存泄露。解决public Object pop(){if(size0) throw new EmptyStackException();elements[size]  null;        // 等待回收return element[--size]; } 缓存缓存的对象容易被程序员遗忘需要设置机制来维护缓存例如不定期回收不再使用的缓存使用定时器。某些情况下使用WeakHashMap可以达到缓存回收的功效。注只有缓存依赖于外部环境而不是依赖于值时WeakHashMap才有效。监听或回调使用监听和回调要记住取消注册。确保回收的最好的实现是使用弱引用weak reference例如只将他们保存成WeakHashMap的键。7、避免显示调用GCJava的GC有强大的回收机制可以简单的记住不要显示调用finalizer。可以这样理解jvm是针对具体的硬件设计的然而程序却不是针对具体硬件设计的所以java代码无法很好的解决gc问题因为他具有平台差异化。另外finalizer的性能开销也非常大从这个角度上考虑也不应该使用它。8、覆盖equals方法请遵守通用约定自反性。x.equals(x) true对称性。当前仅当y.equals(x)true时x.equals(y)true传递性。if(x.equals(y)y.equals(z))y.equals(z)true一致性。非空性。x.equals(null)false9、覆盖equals方法时总要覆盖hashCode为了保证基于散列的集合使用该类HashMap、HashSet、HashTable同时也是Object.hashCode的通用约定覆盖equals方法时必须覆盖hashCode。10、始终覆盖toStringObject的toString方法的通用约定是该对象的描述。注意覆盖时如果有格式请备注或者严格按照格式返回。11、谨慎覆盖clone12、考虑实现Comparable接口13、使类和成员的可访问性最小化目的是解耦。简单来讲使用修饰符的优先级从大到小privateprotecteddefault(缺省)public。如果在设计之初设计为private修饰符后在之后的编码过程如果不得不扩大其作用于应该先检查是否设计的确如此。子类覆盖超类不允许访问级别低于超类的访问级别。超类的protected子类覆盖后不能改为default。成员变量决不允许是公有的。一旦设置为公有则放弃了对他处理的能力。这种类并不是线程安全的。即使是final的也不允许。除非希望通过public static final来暴露常量。成员变量总是需要使用setter和getter来维护。有一个例外长度非零的数组。这是安全漏洞的一个根源。// 安全漏洞此处的数组并不是不可变的 public static final Thing[] VALUES  {...} 改进private static final Thing[] PRIVATE_VALUES  {...} // 此时获取到的才是“常量” public static final ListThing VALUS  Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)) 另一种private static final Thing[] PRIVATE_VALUES  {...} // 此时获取到的才是“常量” public static final Thing[] values(){return PRIVATE_VALUES.clone(); } 14、在公有类中使用访问方法而非公有成员变量类似1315、使可变性最小化16、复合优先于继承继承有利于代码复用但是尽可能不要进行跨包的继承。包内的继承是优秀的设计方式一个包里的文件处在同一个程序员的控制之下。但是继承有其局限性子类依赖于超类。超类一旦发生更改将可能破坏子类。并且如果超类是有缺陷的子类也会得“遗传病”。复合即不扩展已有的类而是在的类中新增一个现有类的。相当于现有类作为一个组建存在于新类中。如此将只会用到需要用到的东西而不表现现有类所有的方法和成员变量。新类也可以称为“包装类”也就是设计模式中的Decorate模式。17、要么就为继承而设计并提供文档说明要么就禁止继承18、接口优于抽象类19、接口只用于定义类型20、类层次优先于标签类21、用函数对象表示策略函数参数可以传入类似listener的对象目的是使用listener中的方法。如果使用匿名的参数每一次调用会创建新的对象。可以将listener声明为成员变量每次都复用同一个对象并且可以使用静态域static变量。比如String类的CASE_INSENSITIVE_ORDER域。22、优先考虑静态类成员嵌套类的目的应该只是为了他的外围类提供服务如果以后还可能用于其他环境中则应该设计为顶层类。静态类相当于一个普通的外部类只是恰好声明在了一个类内部。通常的用户是Calculator.Operation.PLUS等。和普通类的区别只是在PLUS前有了2个前缀来表明其含义。而非静态类必须存在于外部类对象中。不要手动在外部创建一个内部非静态类对象创建的过程是instance.New MemberClass()。这非常奇怪。如果成员类不需要访问外围类则需要添加static是他成为静态成员类否则每个实例都将包含一个额外指向外围对象的引用。将会影响垃圾回收机制。23、应指定泛型的具体类型而不是直接使用原生类型。例如应该指定ListE而不建议直接使用List。24、消除非首检警告在使用IDE进行编码时强大的IDE都会在你编码过程中提示warning需要尽可能的消除warning至少应该小心这些warning。慎用SuppresWarning如果IDE提示你可以通过添加该注解解决掉warning请不要那么做。如果实在要使用请添加注释说明原因。25、列表优先于数组类比泛型数组是有一定缺陷的。List和List是没有关系的而Sub[]是Super[]的子类。// Fails at runtime Object[] objectArray  new Long[1]; objectArray[0]  I dont fit in;       // throw exception// wont compile ListObject ol  new ArrayListLong();   // Incompatible types ol.add(I dont fit in); 从代码中可以看到使用泛型会提前发现错误。26、优先考虑泛型27、优先考虑泛型方法28、利用有限制通配符来提升API的灵活性PECSproducer-extendsconsumer-super。//public class StackE{ //    public Stack(); //    public void push(E e); //    public E pop(); //    public boolean isEmpty(); //}public void pushAll(Iterator? extends E src){for(E e : src)push(e); }public void popAll(Collection? super E dst){while(!isEmpty()){dst.add(pop());} }// Get and Put Principle 所有comparable和comparator都是消费者Consumer。29、优先考虑类型安全的异构容器30、用enum代替int常量public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } public enum Orange { NAVEL, TEMPLE, BLOOD } 枚举型在java中非常强大当需要一组固定常量时使用enum比int好很多。比如代码可读性安全性等。31、enum用实例域代替序数// bad solution public enum Ensemble {SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET;public int numberOfMusicians() { return ordinal()  1; } } // // improvement public enum Ensemble {SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12);private final int numberOfMusicians;Ensemble(int size) { this.numberOfMusicians  size; }public int numberOfMusicians() { return numberOfMusicians; } } 永远不要像第一种的方式利用序数访问enum需要在构造函数中使用参数来初始化。32、用EnumSet代替位域public class Text{public static final int STYLE_BOLD                      1  0;    // 1public static final int STYLE_ITALIC                     1  1;    // 2public static final int STYLE_UNDERLINE           1  2;    // 4public static final int STYLE_STRIKETHROUGH  1  3;    // 8public void applyStyles(int styles){  // ...} }//  text.applyStyles(STYLE_BOLD | STYLE_ITALIC); 以上叫做位图法但是有更好的方案来传递多组常量——EnumSet。public class Text{public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }// 注意此处使用的是Set而不是EnumSetpublic void applyStyles(SetStyle styles){  // ...} }//  text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); 33、用EnumMap代替序数索引任何时候都不要使用enum的ordinal()方法。34、用接口模拟可伸缩的枚举35、注解优先于命名模式36、坚持使用Override注解38、检查参数的有效性公有方法检查参数参数异常需要跑出Exception。私有方法利用断言assertion检查参数。39、必要时进行保护性拷贝假设类的客户端会尽其所能来破坏这个类的约束条件因此你必须保护性的设计程序。以下是一个不可变类的设计。public Period(Date start, Date end){this.start   new Date(start);        // 使用了值的拷贝没有使用原对象指针this.end  new Date(end);if(this.start.compareTo(this.end)0)throw new IllegalArgumentException(start   after   end) } 注意保护性拷贝是在检查参数之前进行的防止多线程的影响。不要使用clone方法进行保护性拷贝。以上方法防御了传入参数的修改但是对于get方法获取到的对象仍然可以被修改通过以下方法可以防止这种攻击。public Date start(){return new Date(start); }public Date end(){return new Date(end); } 40、谨慎设计方法签名41、慎用重载42、慎用可变参数43、返回0长度的数组或者集合而不是nullnull一般用于表示没有被初始化或处理如果方法返回了null则需要在上层做更多的处理以防止NPE。44、为所有导出的API元素编写文档注释正确的javadoc文档需要每个被导出的类、接口、构造器、方法和域之前增加文档注释。注释应该是对实现透明的只需要简洁的描述它和客户端之间的约定。并且还应该附上该方法的副作用。45、将局部变量的作用域最小化46、for-each优先于for循环for-each规避掉了for循环的index变量的引用通常来说它是不必要的——会增加引入错误的风险并且风险一旦发生很难被发现。不过有三种情况下无法使用for-each注在jdk1.8中已经很好的解决了这些问题。过滤转换平行迭代48、如果需要精确的答案请避免使用float和doublefloat和double是执行的二进制浮点运算目的是在广泛数值范围上使用精确的快速近似计算而设计的。然而他们并没有提供完全精确的计算实际应用中经常会碰到出现x.99999等结果。尤其是在进行货币计算时他们并不适用。比如System.out.println(1.03-.42); 得到的结果将是0.610000000001。为了解决这个问题需要使用BigDecimal。然而这也有一些问题相对于普通的运算它显得更加麻烦而且也更慢。通常来说后一个缺点可以忽略但是前者可能会让人很不舒服。有一种做法是将需要处理的数值*10(或更多使用int进行计算不过需要你自己处理四舍五入等操作。49、基本类型优先于装箱基本类型基本类型只有值装箱类具有与他们值不同的同一性。基本类型只有功能完备的值装箱类还具有非功能值null。所以你可能会碰到NPE基本类型省空间省时间50、如果有更精确的类型请避免使用字符串字符串不适合代替其他值的类型。例如intboolean等不适合代替枚举类型第30条不适合聚集类型51、当心字符串连接的性能操作符“”可以将多个字符串进行连接。但是在大规模使用“”的情况下连接n个字符串的开销是n的平房级时间。这是由于字符串的不可变性导致的。在这种情况下请使用StringBuilder进行连接。52、通过接口引用对象53、接口优先于反射机制使用反射机制会带来以下的问题丧失了编译期类型检查代码笨拙冗长性能损失反射基本上只适合用在编写组件时、代码分析器、RPC等场景下使用。在使用反射机制时如果可能尽可能只通过反射机制实例化对象而访问方法时使用已知的接口或者超类。54、谨慎使用JNI55、谨慎进行优化很多计算上的过失都被归咎于效率没有必要达到的效率而不是任何其他原因——甚至包括盲目的做傻事。——William A. Wulf不要去计较效率上的一些小小的得失在97%的情况下不成熟的优化才是一切问题的根源。——Donald E. Knuth在优化方面我们应该遵守两条规则规则1:不要进行优化。规则2仅针对专家还是不要进行优化——也就是说在你还没有绝对清晰的优化方案前请不要进行优化。——M. A. Jackson这些格言比java的出现还要早20年。他们讲述了一个关于优化的深刻事实优化的弊大于利。要努力编写好的程序而不是快的程序。低耦合的重要性远远大于性能。当程序编写得足够低耦合后通过工具发现了性能瓶颈的代码块才可以保证对其的修改不影响任何外部环境。56、遵守普遍的命名规则57、只针对异常情况才使用异常不要尝试通过异常机制来做正常代码应该做的事情比如检查数组下标。jvm很少对异常进行优化因为它只用于不正常的情况。并且如果你将代码放入try-catch代码块jvm就丧失了本来可以对它进行的优化。58、对于可恢复的情况使用受检异常对于编程错误的情况使用运行时异常如果期望调用者适当的恢复则需要使用受检异常强迫调用者食用try-catch代码块或者将他们抛出去当调用发生前提违例——违反约定的情况时使用运行时异常这个时候程序已经无法再执行下去了。例如调用数组的-1索引。59、避免不必要的受检异常 往期推荐 报告老板这次的缓存事故是这样的...面试官你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景2万字看完这篇才敢说自己真的懂线程池关注我每天陪你进步一点点
http://www.huolong8.cn/news/145604/

相关文章:

  • 网站开源是什么意思给被k的网站做友链
  • 网站开发形式有哪些网站建设九亭
  • dedecms的网站如何添加个引导页专注手机网站建设
  • dedecms 门户网站wordpress微信风格主题
  • 沈阳网站建设沈阳怀化seo网站
  • 响应式网站 尺寸wordpress清理过期文件夹
  • 公司网站如何建设教学视频在百度上怎么建立网站
  • 网站会员体系wordpress在线视频直播
  • 单位门户网站是什么意思新网域名管理
  • 公司部门撤销要求转岗不同意怎么办厦门百度seo点击软件
  • 鞍山做网站哪家好网页游戏传奇类
  • 诸城网站制作石家庄信息门户网站定制
  • 爱站网官网查询域名福田蒙派克质量怎么样
  • 黄石专业网站建设推广公司的网站建设是什么部门
  • 网站主题有哪些内容wordpress 4.9摘要
  • 网页制作与网站建设pdf中国职业培训在线
  • 如何诊断网站h5网站开发案例
  • 手机端网站重构成都网红景点
  • 做微电网的公司网站美食网站网页设计
  • 青岛网站设计品牌企业外链代发
  • erp网站代做网络规划设计师考试全程指导(第2版) pdf
  • 网站地图海南搜索引擎优化
  • 深圳做营销型网站建设部相关网站
  • 网站建设需要用什么书天津哪家做企业网站
  • 地方汽车网站模板购买图片外链在线生成
  • 百度网站评价如何制作一个网站包含多个网页
  • 帮助中心网站怎么做如何开通微信商城
  • 简单网站模板哪里有网站直播做美食的
  • 连云港网站关键词优化服务大连的网页设计公司
  • 怎样创建网站或网页网站建设要后台吗