232

什么是包装类?
这些类有什么用?

4

17 回答 17

177

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

于 2009-05-20T17:19:59.283 回答
72

就像它听起来的那样:一个将另一个类或 API 的功能“包装”在更简单或仅仅是不同的 API 中的类。

请参阅:适配器模式外观模式

于 2009-05-20T17:18:10.520 回答
41

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

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 ;

尽管双精度值被显式转换为整数值,也称为向下转换。

于 2012-07-02T10:14:01.123 回答
18

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

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

干杯!

于 2009-05-20T17:21:27.173 回答
8

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

更正式的定义是实现适配器模式的类。这允许您将一组 API 修改为更可用、更易读的形式。例如,在 C# 中,如果您想使用本机 Windows API,将其包装到符合 .NET 设计准则的类中会有所帮助。

于 2009-05-20T17:18:52.937 回答
8

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

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

于 2009-05-20T18:32:11.010 回答
7

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

编辑:

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

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

于 2009-05-20T17:43:19.610 回答
7

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

于 2011-09-09T05:11:15.657 回答
5

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

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

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

于 2009-05-20T17:25:44.670 回答
3

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

于 2009-05-20T17:18:39.160 回答
3

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

于 2011-07-04T08:14:17.730 回答
3

Java 编程为每个原始数据类型提供了包装类,将原始数据类型转换为包装类对应的对象。

于 2012-05-01T12:42:22.513 回答
1

使包装类健康并不是一件容易的事。理解一个包装类是如何被其他人设计的也不是一件容易的事。因为它是想法,而不是代码。只有理解了思想,才能理解 wrapper。

于 2014-11-18T03:14:38.683 回答
0

包装类的出现是为了满足程序员的基本需求——即在只允许对象的地方使用原始值。正如他们的名字所暗示的,包装类包装一个原始值并将该值保存在一个对象中。因此,所有不允许使用原语的地方——例如泛型、hashmap-keys、Arraylists 等——程序员现在可以选择将这些原语值作为其对应的包装类型提供。

此外,这些包装器类型具有许多实用方法,用于从原始类型转换为相应的包装器类型并返回,以及从字符串转换为包装器类型并返回。

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

于 2015-11-03T06:23:57.000 回答
0

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

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

易于使用:我可以轻松地启动对象。通常启动阶段由许多步骤构成。

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

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

于 2015-11-20T09:27:17.720 回答
0

包装类是一个仅用于保存某些东西并向其添加一些功能的类。在 Java 中,因为原语(如整数、浮点数、字符......)不是对象,所以如果你想像对待它们一样对待它们,那么你必须使用包装类。假设你想创建一个整数向量,问题是向量只包含对象而不是基元。所以你要做的就是把所有的整数放在一个整数包装器中并使用它。例子:

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();
于 2015-12-14T14:09:45.193 回答
-8

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

于 2011-09-27T11:46:11.593 回答