什么是包装器类?

什么是包装器类?< br > 这样的类有什么用处呢?< / p >
244046 次浏览

顾名思义:一个“包装”的类;另一个类或API在一个更简单或只是不同的API中的功能。

参见:适配器模式门面模式

包装类是用于包装另一个类的类,以便在客户端和被包装的原始类之间添加间接和抽象层。

包装类是一个“包装”其他东西的类,就像它的名字一样。

它更正式的定义是一个实现适配器模式的类。这允许您将一组api修改为更可用、更可读的形式。例如,在c#中,如果你想使用本机Windows API,它有助于将它包装成一个符合. net设计准则的类。

一般来说,包装器类是“包装”或“封装”另一个类或组件功能的任何类。通过提供从底层类或组件实现的抽象级别,它们非常有用;例如,包装COM组件的包装类可以管理调用COM组件的过程,而不会影响调用代码。它们还可以通过减少所涉及的接口点数量来简化底层对象的使用;通常,这有助于更安全地使用底层组件。

一个包装类不一定需要包装另一个类。它可能是一个API类,在一个dll文件中包装功能。

例如,创建一个dll包装类可能非常有用,它负责所有dll的初始化和清理,并创建类方法来包装从GetProcAddress()创建的函数指针。

干杯!

包装器类通常是一个具有对象作为私有属性的类。包装器实现了私有对象的API,所以它可以作为私有对象的参数传递。

假设您有一个集合,并且希望在向其中添加对象时使用某种转换—您编写一个具有集合的所有方法的包装器类。当调用add()时,包装器转换参数,而不是仅仅将它们传递到私有集合中。

包装器可以在任何可以使用集合的地方使用,私有对象仍然可以有其他对象引用它并读取它。

值得注意的是,在某些环境中,包装器类所做的大部分工作都被方面所取代。

编辑:

一般来说,包装器将对包装所做的事情进行扩展,而不关心包装的实现,否则,包装与扩展被包装的类没有任何意义。一个典型的例子是围绕一些其他服务接口添加计时信息或日志功能,而不是将其添加到该接口的每个实现中。

这最终成为Aspect编程的一个典型示例。在方面编程中,您不需要逐个遍历接口函数并添加样例日志记录,而是定义一个切入点(它是一种方法的正则表达式),然后声明希望在所有匹配切入点的方法之前、之后或前后执行的方法。可以公平地说,方面编程是Decorator模式的一种使用,包装器类也可以用于这种模式,但这两种技术都有其他用途。

有几种设计模式可以称为包装器类。

参见我对“代理模式、装饰模式、适配器模式和桥接模式有何不同?”的回答

包装器类是围绕基本数据类型的包装器。它表示基元数据类型在其对应的类实例中,例如布尔数据类型可以表示为布尔类实例。Java中所有的基本包装类都是不可变的,即一旦给包装类实例赋值,就不能再修改。

包装器类是一个包装另一个类并提供客户端和被包装的原始类之间的抽象的类。

包装器是用于在不同平台之间的两个不同应用程序之间进行通信的类

Java编程为每个基元数据类型提供包装类,用于将基元数据类型转换为包装类的对应对象。

包装器类提供了一种将基本类型用作对象的方法。对于每个原语,我们都有一个包装器类,比如,

int Integer
byte Byte

Integer和Byte是原语int和Byte的包装类。当您需要将原语作为对象使用时,有时会有限制,因此包装类提供了一种称为装箱/拆箱的机制。

下面的例子可以很好地理解这个概念

double d = 135.0 d;
Double doubleWrapper = new Double(d);


int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

这就是方法,我们可以使用包装器类类型转换成其他基本类型。当您需要将原语类型转换为对象并使用它们来获取其他原语时,就会使用这种类型的转换。但是对于这种方法,您需要编写一个大代码。但是,使用简单的强制转换技术也可以实现同样的效果,代码片段如下所示

double d = 135.0;
int integerValue = (int) d ;

虽然double值显式转换为整数值,也称为向下转换。

让一个包装类幸福不是一件容易的工作。 了解包装器类是如何被其他人设计的也不是一件容易的事情。 因为这是想法,不是代码。 只有理解了包装的思想,你才能理解包装

包装器类的出现是为了满足程序员的基本需求——即在只允许使用object的地方使用原始值。顾名思义,包装器类包装一个基本值,并将该值保存在Object中。因此,在所有不允许使用原语的地方——比如泛型、hashmap-key、数组列表等——程序员现在可以选择提供这些原语值作为相应的包装器类型。

此外,这些包装器类型有许多实用工具方法,用于从基本类型转换到相应的包装器类型和返回,以及从字符串转换到包装器类型和返回。

我在我的博客上写了一篇关于包装器类的详细文章,深入解释了包装器类型的概念- http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (披露-这个博客是我所有的)

我目前在我的项目中使用了一个包装器类,我得到的主要好处(只是一个扩大主题解释的好处):

异常处理:我的主类(另一个类包装的类)具有在发生异常时抛出异常的方法,因此我创建了一个包装类来处理异常并立即记录它们。因此,在我的主作用域中,没有异常处理。我只是调用一个方法并做一些事情。

易于使用:我可以很容易地启动对象。通常起始阶段由很多步骤组成。

代码可读性:当另一个程序员打开我的代码时,代码看起来非常清晰,易于操作。

隐藏细节:如果你正在生成另一个程序员将要使用的类,那么你可以包装细节,如“错误处理,异常处理,日志消息等……”,这样程序员就不必处理混乱,只需要简单地使用方法。

包装器类是唯一用于保存某些内容并向其添加一些功能的类。 在Java中,由于原语(如int,float,char…)不是对象,所以如果你想把它们当作一个对象,那么你必须使用包装类。 假设你想创建一个int型的Vector,问题是Vector只保存对象而不是原语。所以你要做的就是把所有的整型放在一个Integer包装器中并使用它。例子:< / p >
int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();