`
Listen_ing
  • 浏览: 36725 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Java面向对象设计最佳实践

阅读更多

Java面向对象设计最佳实践

内置类设计

从这篇文章开始进入实战阶段的设计阶段,本文介绍内置类设计的最佳实践。

回顾一下,类(Class)作为Java编程语言中的基本单元模块,提供了面向对象的四种基本性质:抽象性、封装性、继承性和多态性。

在面向对象设计原则中,尽可能偏好方法,而非字段(或属性)。简单的说,方法更好的表达语义。因此,在方法实现过程中,经常会遇到类似的情景,接口方法method1 调用其他方法来完成功能需要。无非有三种情况,利用本类的(静态或者实例的)方法,调用某个类的静态可访问的方法和某个实例可访问的实例方法。但是,良好类设计是尽量的隐藏实现细节,简单清晰地表达语义

客户端程序只关心输入和输出,没有必要去关心中间的细节。回到上述的三情况,尽可能隐藏本类和他类的细节。如果本类和他类相互耦合,那么扩张性和易用性受到一定程度的影响。但是设计人员想让本类和他类相互知晓,或者范围限制(主要是指类之间的访问限制)尽可能小,那么内置类是一个很好的办法。

笔者把内置类分为三类:类内置类(Nested Class)实例内置类(Inner Class)和布局内置类(Local Class)。下面分别介绍这三种类的使用场景和设计方法。

类内置类(Nested Class),在内置类中使用得最多的一类。其作为类的一部分,随外层类(Enclosing Class)顺序地被加载。它的好处是,定义的类内置类仅此一次被创建并加载,可视外层类的类成员。那么使用场景不难得出,对于实例成员不感冒,只关心类成员,并且减少没有必要重复类的创建和加载。在大多数实际情况中,这个模式已经足够了。举一个的JDK里面的例子,迭代Map的时候,键值对实体接口java.util.Map.Entry<K, V>,其定义在java.util.Map<K, V>接口中,自然其修饰符是public static final

为了客户端程序能够利用java.util.Map.Entry<K, V>JDK暴露了它。一般来说,private final static是通用的设计。外层类对其是完全可视的,因此private 是没有问题的。至于final的修饰,要谈到笔者设计经验中的一个原则,尽量使用final修饰可修饰的。其中有几个好处,比如线程安全、拒绝子类、标准化(在后面的设计文章中会详细说明)等。在内置类设计中,不应该期望其他类继承这个类,更不要期望其他人会使用的内置类了。又回到JDK,大家会发现java.util.HashMap<K,V>内部定义不少的类内置类。

使用下了代码实例补充说明上述:

package org.mercy.design;

/**

 * OuterClass 是外层类,NestedClass 类内置类

 * @author mercyblitz

 */

public class OuterClass {

/**

 * private final static 是类内置类的通用设计技巧

 */

private final static class NestedClass {

}

}

代码-1

如果OuterClass类中有实例变量的话,显然NestedClass是不可见的,也是不适用的(因为它是类的一部分)。

这个时候,利用实例内置类可以解决这类问题。

示例代码如下:

package org.mercy.design;

/**

 * OuterClass2 是外层类,InnerClass 实例内置类

 * 

 * @author mercyblitz

 */

public class OuterClass2 {

private String message;

/**

 * 使用private final 是一种好习惯。:D

 */

private final class InnerClass {

/**

 * 输出OuterClass2消息

 */

private void outputMessageFromOuterClass2() {

// 注意,this的命名空间

System.out.println(OuterClass2.this.message);

}

}

}

代码-2

在“代码-2”中,InnerClass利用OuterClass2message字段作为输出。

可能有人会说,InnerClass这种实例内,为了得到这个类,不得不创建一个实例,太浪费资源了,为什么不直接把OuterClass实例作为参数,直接传入到InnerClass的方法呢?

没错,可以那么做。不过单从访问外层类的实例变量而言,利用实例内置类是有点显得浪费。如果客户端利用了泛型编程的话,情况就会不同。

总所周知,泛型设计能够提高灵活性,可是也有很多限制。模版参数类型是跟随其寄主类的,模板参数类型是不会写入class文件中的,这就是为什么反射(Reflection)不能解析出类的模板参数类型。但是,模板参数类型在实例(对象)范围是可用的(或可视的)。如果内置类中想要利用外层类的模板参数类型的话,那么实例内置类就有很大用处。

例子如下:

package org.mercy.design;

/**

 * OuterClass3 是外层类,InnerClass 实例内置类

 * 

 * @author mercyblitz

 * @param <T>

 *            模板参数类型,实例内置类可以利用

 */

public class OuterClass3<T> {

private T data;

/**

 * 使用private final 是一种好习惯。:D

 */

private final class InnerClass {

public void setData(T newData) {

OuterClass3.this.data = newData;

// DOES Other things

}

}

}

代码-3

      

“代码-3”中的实例内置类利用外层类OuterClass3中的模板参数T,作为setData参数的类型。

看似类内置类和实例内置类已经足够使用了。考虑这么一个场景,一个方法利用了内置类来实现功能,这个方法中的变量需要被内置类来利用,通常可以把变量作为参数,传入内置类构造器或者其方法中,这也是通常的方法。不过利用布局内置类(Local Class)更为方便,因为局部内置类是在块中(方法也是一种特殊的块)定义的,这样就很好的解决了上下文的参数传递问题。

参看代码:

package org.mercy.design;

/**

 * OuterClass4 是外层类,Printer 局部内置类

 * 

 * @author mercyblitz

 */

public class OuterClass4 {

public void print(byte[] bytes) {

final String message = new String(bytes);

/**

 * 名为Printer LocalClass,不必把message作为参数传递。

 */

class Printer {

private void doPrint() {

System.out.println(message);

}

}

new Printer().doPrint();

}

public static void main(String[] args) {

new OuterClass4().print("AAAAAAA".getBytes());

}

}

代码-4

在“代码-4”的示例中,有人可能会说,这看不出什么好处呀?!如果内置类依赖的变量超过4个(Effective Java书中提到超过四个参数的话,不利于维护),那么局部内置类是不是方便维护呢?

顺便提到,匿名内置类是局部内置类的一种。

不难发现,局部内置类的缺点是代码混杂(方法和类混在一起),如果依赖局部变量不多的情况下,在一定程度上面,增加了维护成本。

最后的篇幅来总结一下这几种内置类的特点,以及使用场景和设计技巧。

共同特点,不想暴露并且不期望被外部使用或者扩张(强调一下,一般类中私有和包内私用都是好的设计技巧),通过类的四大特性提供更优于方法的方法和外部内实现交互,从而达到良好设计目的。

对于类内置类(Nested Class),适合的绝大多数内置类场景,利于维护。但不适合利用外层类模板参数类型和实例变量。

就实例内置类(Inner Class),适合利用外层类模板参数类型和实例变量,更好的弹性设计。可是加载其类时,必须实例化外部类,造成不必要开销,因此不是必须,尽量使用类内置类。

局部内置类(Local Class),适合多局部变量依赖的场景,提高可维护性,相反就不适合。

因此,内置类的设计和其他面向对象设计类似,根据适合的场景来合理设计。在设计上,没有最好,只有更好。笔者精力和经验优先,希望大家指正,谢谢。

<!--EndFragment-->
分享到:
评论

相关推荐

    Java面向对象设计最佳实践_-_内置类设计

    本文档“Java面向对象设计最佳实践—内置类设计”深入探讨了如何利用Java的内置类机制来优化代码结构,提高可读性和可维护性。以下是基于这个主题的详细知识点: 1. **内置类(Inner Classes)的概念**: 内置类...

    Java面向对象设计最佳实践 - 方法设计(一).docx

    Java面向对象设计最佳实践主要关注方法的设计,这是创建高效、可维护和易于理解的代码的关键。方法作为类或对象的行为,它们定义了类的功能并利用多态性来增强设计的灵活性。以下是一些关于方法设计的重要实践: 1....

    Java面向对象程序设计耿祥义版课件

    Java面向对象程序设计是编程领域中的核心概念,尤其在企业级应用开发中占据了主导地位。耿祥义版的课程着重讲解了这一主题,通过PPT和源码的形式,旨在帮助学习者深入理解并掌握Java的面向对象特性。下面将详细阐述...

    Java面向对象程序设计教程

    Java面向对象程序设计是软件开发中的核心概念,它基于面向对象的思想,使代码更易于理解和维护。本教程旨在深入探讨这一主题,通过课件和源代码的结合,帮助学习者全面掌握Java的面向对象特性。 首先,我们来理解...

    JAVA面向对象第一期PPT和演示代码

    11. **设计模式**:面向对象设计模式是解决特定问题的通用、可重用的解决方案,例如单例模式、工厂模式、观察者模式等,它们是软件设计的最佳实践。 12. **演示代码**:资源中的演示代码提供了实际的编程示例,帮助...

    《Java面向对象程序设计》课本例子源代码

    《Java面向对象程序设计》是一本深入探讨Java编程语言中面向对象特性的教材,而提供的源代码是为了辅助读者更好地理解和实践书中的理论知识。这些源代码涵盖了类、对象、封装、继承、多态等核心面向对象概念,是学习...

    《Java面向对象程序设计》例子源代码

    《Java面向对象程序设计》是一本深入探讨Java编程语言中面向对象特性的经典教材。这本书通过丰富的实例,帮助读者理解并掌握如何利用Java进行高效、可靠的面向对象编程。以下是一些核心的知识点: 1. 面向对象基础...

    面向对象程序设计-Java(第二版)

    面向对象程序设计-Java(第二...以上只是Java面向对象编程的部分基础知识,实际的课程内容可能还会涵盖更多的高级主题,如反射、注解、设计模式等。通过深入学习这些内容,开发者可以构建高效、可维护的Java应用程序。

    java面向对象基础、高级pdf讲义

    15. 设计模式:设计模式是解决常见软件设计问题的最佳实践。如工厂模式、单例模式、观察者模式、装饰器模式等,都是面向对象编程中的重要工具。 以上就是Java面向对象的基础和高级知识点,通过深入学习和实践,...

    Java面向对象教程 应用软件工程原理编程

    Java面向对象教程是深入理解Java编程的关键,它涵盖了软件工程中的基本原则,并将其应用于实际编程实践。面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它基于“对象”的概念,这些对象封装了...

    《面向对象程序设计——Java语言》电子课件(程细柱PPT)

    通过这个电子课件,学习者不仅可以掌握Java语言的面向对象编程技术,还能了解到实际项目开发中的一些最佳实践。程细柱的讲解方式通常深入浅出,结合实例,有助于学习者快速理解和掌握知识要点。

    面向对象程序设计(Java)教学课件

    15. 设计模式:设计模式是解决常见编程问题的最佳实践,例如工厂模式、单例模式、观察者模式等,它们在Java编程中广泛使用。 通过学习这些Java面向对象编程的核心概念,学习者可以更好地理解和应用Java语言,从而...

    清华Java语言与面向对象程序设计

    《清华Java语言与面向对象程序设计》是一门深入讲解Java编程和面向对象设计的课程,旨在帮助学习者掌握Java编程的基础知识以及如何运用面向对象的思想进行软件开发。课程内容覆盖了从基本语法到高级特性,从理论概念...

    java面向对象编程语言

    Java是一种广泛使用的面向对象编程语言,其设计理念是“一次编写,到处运行...学习Java面向对象编程,不仅需要理解上述知识点,还要不断实践和应用,通过编写实际项目来巩固理论知识,才能真正掌握这门强大的编程语言。

    java面向对象

    总的来说,Java面向对象编程提供了一种强大的工具集,允许开发者构建复杂、可扩展且易于维护的软件系统。掌握这些核心概念和机制,是成为一名合格Java开发者的基石。在实际开发中,结合设计模式和最佳实践,可以...

    Java面向对象流程图

    设计模式是解决常见问题的最佳实践,如单例模式、工厂模式、装饰器模式等,它们为面向对象编程提供了可复用的解决方案。 以上知识点涵盖了Java面向对象的核心概念,理解和掌握它们对于深入学习Java编程至关重要。...

    JAVA面向对象开发宠物商店系统

    在JAVA面向对象开发的宠物商店系统中,我们深入探讨了面向对象编程的核心概念和技术,以构建一个高效、可扩展且易于维护的系统。这个系统基于对象的高内聚和低耦合原则,确保了各组件之间的独立性,提高了代码的复用...

    Java语言与面向对象程序设计-印旻ppt

    5. **设计模式**:面向对象设计模式是解决特定问题的最佳实践,如单例模式、工厂模式、观察者模式等,这些模式在Java编程中广泛应用。 印旻的PPT将详细解释这些概念,并通过实例和练习帮助学习者理解和应用。通过...

    java面向对象代码实例

    通过这些实例,学习者可以深入理解Java面向对象编程的实际应用,逐步掌握如何设计和使用类,如何进行封装、继承和多态的实现,以及如何通过这些特性来提高代码的可读性和可维护性。对于初学者而言,这些实例是宝贵的...

    java面向对象编程英文

    总的来说,这是一本面向Java编程入门到中高级水平学习者的教材,它不仅全面覆盖了Java编程的核心概念,还深入探讨了面向对象编程的设计原则和最佳实践。通过这本书,读者可以学习如何应用Java语言特性,理解并实践...

Global site tag (gtag.js) - Google Analytics