死磕-高效的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可能处于不一致的状态,类是无法仅仅通过检验构造器参数的有效性来保证一致性的,试图使用处于不一致的状态的对象将会导致失败,调试起来是很困难的。

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

明天见~~

相关文章
|
10天前
|
设计模式 安全 Java
Java编程中的单例模式深入剖析
【10月更文挑战第21天】在Java的世界里,单例模式是设计模式中一个常见而又强大的存在。它确保了一个类只有一个实例,并提供一个全局访问点。本文将深入探讨如何正确实现单例模式,包括常见的实现方式、优缺点分析以及最佳实践,同时也会通过实际代码示例来加深理解。无论你是Java新手还是资深开发者,这篇文章都将为你提供宝贵的见解和技巧。
90 65
|
1天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
11 4
|
2天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
14 5
|
1天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
15 3
|
2天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
9 1
|
6天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
12 3
|
8天前
|
监控 安全 Java
Java多线程编程的艺术与实践
【10月更文挑战第22天】 在现代软件开发中,多线程编程是一项不可或缺的技能。本文将深入探讨Java多线程编程的核心概念、常见问题以及最佳实践,帮助开发者掌握这一强大的工具。我们将从基础概念入手,逐步深入到高级主题,包括线程的创建与管理、同步机制、线程池的使用等。通过实际案例分析,本文旨在提供一种系统化的学习方法,使读者能够在实际项目中灵活运用多线程技术。
|
9天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
6天前
|
缓存 安全 Java
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文将深入探讨Java中的多线程编程,包括其基本原理、实现方式以及常见问题。我们将从简单的线程创建开始,逐步深入了解线程的生命周期、同步机制、并发工具类等高级主题。通过实际案例和代码示例,帮助读者掌握多线程编程的核心概念和技术,提高程序的性能和可靠性。
9 2
|
7天前
|
Java
Java中的多线程编程:从基础到实践
本文深入探讨Java多线程编程,首先介绍多线程的基本概念和重要性,接着详细讲解如何在Java中创建和管理线程,最后通过实例演示多线程的实际应用。文章旨在帮助读者理解多线程的核心原理,掌握基本的多线程操作,并能够在实际项目中灵活运用多线程技术。