什么是包装器类?


Answers:


171

通常,包装器类是“包装”或“封装”另一个类或组件的功能的任何类。通过提供基础类或组件的实现的抽象级别,这些功能很有用;例如,包装COM组件的包装器类可以管理调用COM组件的过程,而无需使用它来烦扰调用代码。它们还可以通过减少涉及的接口点数来简化基础对象的使用。通常,这可以更安全地使用基础组件。


15
当包装器必须遵守特定的接口并且必须支持多态行为时,将使用包装器类(作为适配器)。另一方面,当人们希望使用更简单或更简单的界面时,可以使用立面。
Yadu 2012年

3
在这篇文章中,建议使用包装器来为后绑定类创建严格定义的代理:我可以使用后绑定...吗?除了上面提到的Paul Sonier之外,这是否是包装的有效附加用途?
Todd

1
@NirajanSingh包装器重用了两个已经存在的接口,并使一个接口与另一个接口一起工作。另一方面,facade创建了一个新界面。
Alireza 2015年

67

听起来像是:一个类,它以更简单或更简单的API“包装”另一个类或API的功能。

请参阅:适配器模式门面模式


是! 通常是Facade模式的同义词。在许多代码文档中,我看到了明显的Facade方法,描述为“包装到XX :: yy方法”或有点像“包装到带有异常处理的XX :: yy方法”。
彼得·克劳斯

41

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

int Integer
byte 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值显式转换为整数值,也称为向下转换。


1
您的答案暗示包装器类仅适用于原始对象。
Guillaume F.

17

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

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

干杯!


8

包装器类是一个像其名称一样“包装”其他东西的类。

对其的更正式定义是实现Adapter Pattern的类。这使您可以将一组API修改为更可用,更易读的形式。例如,在C#中,如果要使用本机Windows API,则有助于将其包装到符合.NET设计准则的类中。


2
根据我对适配器模式的理解,它与包装器不同:如果X包装Y,则X应该封装Y 的状态,而不是其Identity。给定X的两个实例,两个实例都包裹着一个Y,就没有办法证明X的两个实例都包裹着相同的Y的实例。对所适配对象的更改不会被视为对适配器本身的更改。
2013年


7

还可能需要注意的是,在某些环境中,包装类可能要做的许多事情都已由方面取代。

编辑:

通常,包装器将扩展包装器的功能,而不必担心包装器的实现,否则包装与扩展包装的类无关。一个典型的示例是在其他服务接口周围添加计时信息或日志记录功能,而不是将其添加到该接口的每个实现中。

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


7

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


5

包装器类通常是将对象作为私有属性的类。包装器实现了该私有对象的API,因此可以将其作为参数传递给私有对象。

假设您有一个集合,并且想要在向其添加对象时使用某种形式的翻译-您编写了一个包含所有集合方法的包装器类。调用add()时,包装程序将转换参数,而不仅仅是将其传递到私有集合中。

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


1
同意,我对包装器的个人看法是,它们的外观和感觉类似于原始类型,并且可以实现相同的接口,从而确定包装实例的状态。它们作为“拦截”成员呼叫的一种方式存在。
路加·普普利特

3

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


3

包装器类是原始数据类型的包装器。它在它们对应的类实例中表示原始数据类型,例如,布尔数据类型可以表示为布尔类实例。Java中的所有原始包装器类都是不可变的,即,一旦为包装器类实例分配了值,就不能再对其进行更改。



1

要使包装器类处于良好状态并非易事。要了解包装器类是如何由其他包装器设计的,这也不容易。因为这是想法,而不是代码。只有了解了这个主意,您才能了解包装器。


0

包装器类的出现是为了满足程序员的基本需求-即在仅允许对象的地方使用原始值。顾名思义,包装器类将原始值包裹起来并将其保存在Object中。因此,在所有不允许使用原语的地方(例如泛型,哈希映射键,Arraylist等),程序员现在可以选择提供这些原语值作为其对应的包装器类型。

此外,这些包装器类型具有许多实用程序方法,可用于从原始类型转换为对应的包装器类型,然后从字符串转换为包装器类型并返回。

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


0

我目前在我的项目中使用了包装器类,并从中获得了主要的好处(只是扩大主题说明的一项好处):

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

易于使用:我可以轻松启动该对象。通常,启动阶段包括许多步骤。

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

隐藏详细信息:如果您正在生成另一个程序员将​​要使用的类,则可以包装诸如“错误处理,异常处理,日志消息等...”之类的详细信息,以便程序员不必处理混乱,只是简单地使用方法。


0

包装器类是仅用于保存某些东西并为其添加一些功能的类。在Java中,由于原语(例如ints,floats,chars ...)不是对象,因此,如果要像对待原语一样,则必须使用包装器类。假设您要创建一个整数类型的Vector,则问题是Vector仅包含对象而不是原始对象。因此,您要做的就是将所有int放入Integer包装器中并使用它。例:

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();

这被称为装箱原语而不是包装。
电子人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.