死磕-高效的Java编程(二)

简介: 死磕-高效的Java编程(二)

 一、遇到多个构造器参数时要考虑使用构建器

a、静态工厂和构造器有共同的局限性,它们都不能很好地扩展到大量的可选参数。

b、举个例子:

比如在我们的项目中,用一个bean来表示一个活动的标签,这个活动有很多的标签,这些标签中有几个是必须的,还有一些是可选的标。而大多数的活动中某几个可选的标签中都会有非零的值。

c、对于上面的类子中,应该怎么去操作呢?程序员们大多数会想到重载构造器来完成上面的例子。

用代码来说下上面的例子:

package com.wzy;

/**

* @author weizhaoyang01

*/

public class Activities {

   /**

    * 标签1:必须标签

    */

   private   final String   label1;


   /**

    * 标签2:必须标签

    * @param label1

    */

   private  final  String   label2;


   /**

    * 标签3:可选标签

    * @param label3

    *

    */

   private  final  String  label3;

   /**

    * 标签4:可选标签

    * @param label4

    *

    */

   private  final  String  label4;

   /**

    * 标签5:可选标签

    * @param label5

    *

    */

   private  final  String  label5;

   /**

    * 标签6:可选标签

    * @param label6

    *

    */

   private  final  String  label6;


   public Activities( String label1,String label2) {

      this(label1,label2,null);

   }

   public Activities(String label1,String label2,String label3){

       this(label1,label2,label3,null);

   }

   public Activities(String label1,String label2,String label3,String label4){

       this(label1,label2,label3,label4,null);

   }

   public Activities(String label1,String label2,String label3,String label4,String label5){

       this(label1,label2,label3,label4,label5,null);

   }

   public  Activities(String label1,String label2,String label3,String label4,String label5,String label6){

       this.label1=label1;

       this.label2=label2;

       this.label3=label3;

       this.label4=label4;

       this.label5=label5;

       this.label6=label6;

   }

}

在上面的例子中是用第一个构造函数只有两个必要的参数,第二个构造函数有一个可选的参数,第三个构造函数有两个可选的参数,以此类推,最后一个构造函数包含所有的可选参数。

d、对于上面的代码中,当你想要创建实例的时候,就利用参数列表最短的构造器,但是该列表中要包含设置的所有的所有参数:

 Activities activities = new Activities("a","b","c","d","e","f");

e、上面方式的缺点如下:

1)、这个构造器本来你有很多不想设置的参数,但是还得不得不给它们传值

2)、问题随着参数增多的时候,它就很快就失去了控制

3)、重叠构造器的方式可行,但是很多参数的时候,客户端的代码会很难编写并且较难以阅读,如果参数的值的顺序错乱的话,编译器也不会报错,但是运行时会报错。

f、采用JavaBeans模式

1、先调用一个无参数的构造器来创建对象,然后再调用setter的方法来设置每个必要的参数以及每个相关的可选参数。

代码如下:

public  Activities(){
   }
   public void setLabel1(String str1){
       label1=str1;
   }
   public void setLabel2(String str1){
       label1=str1;
   }
   public void setLabel3(String str1){
       label1=str1;
   }
   public void setLabel4(String str1){
       label1=str1;
   }
   public void setLabel5(String str1){
       label1=str1;
   }
   public void setLabel6(String str1){
       label1=str1;
   }

Activities  activities=new Activities();

      activities.setLabel1("a");

      activities.setLabel2("b");

      activities.setLabel3("c");

      activities.setLabel4("d");

      activities.setLabel5("e");

      activities.setLabel6("f");


2、这种方式弥补了重叠构造器模式的不足,但是创建实例很容易,这样产生的代码阅读起来也很容易。

3、但是这样做有它的缺点:

1)、在构造过程中,JavaBean可能处于不一致的状态,类是无法仅仅通过检验构造器参数的有效性来保证一致性的,试图使用处于不一致的状态的对象将会导致失败,调试起来是很困难的。

下回分享解决上面两种方式的问题的一种模式-构建器。

明天见~~

相关文章
|
6天前
|
Java
JAVA并发编程系列(7)Semaphore信号量剖析
腾讯T2面试,要求在3分钟内用不超过20行代码模拟地铁安检进站过程。题目设定10个安检口,100人排队,每人安检需5秒。实际中,这种题目主要考察并发编程能力,特别是多个线程如何共享有限资源。今天我们使用信号量(Semaphore)实现,限制同时进站的人数,并通过信号量控制排队和进站流程。并详细剖析信号量核心原理和源码。
|
4天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
2天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
22 10
|
3天前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
3天前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。
|
3天前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
22 11
|
1天前
|
算法 安全 Java
JAVA并发编程系列(12)ThreadLocal就是这么简单|建议收藏
很多人都以为TreadLocal很难很深奥,尤其被问到ThreadLocal数据结构、以及如何发生的内存泄漏问题,候选人容易谈虎色变。 日常大家用这个的很少,甚至很多近10年资深研发人员,都没有用过ThreadLocal。本文由浅入深、并且才有通俗易懂方式全面分析ThreadLocal的应用场景、数据结构、内存泄漏问题。降低大家学习啃骨头的心理压力,希望可以帮助大家彻底掌握并应用这个核心技术到工作当中。
|
1天前
|
Java
死磕-java并发编程技术(二)
死磕-java并发编程技术(二)
|
1天前
|
存储 Java 调度
死磕-java并发编程技术(一)
死磕-java并发编程技术(一)
|
2天前
|
Java 调度 开发者
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java多线程编程的核心概念和实际应用,通过浅显易懂的语言解释多线程的基本原理,并结合实例展示如何在Java中创建、控制和管理线程。我们将从简单的线程创建开始,逐步深入到线程同步、通信以及死锁问题的解决方案,最终通过具体的代码示例来加深理解。无论您是Java初学者还是希望提升多线程编程技能的开发者,本文都将为您提供有价值的见解和实用的技巧。
9 2