什么是包装类?

时间:2009-05-20 17:16:16

标签: design-patterns wrapper

什么是包装类?
这些课程有用吗?

17 个答案:

答案 0 :(得分:164)

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

答案 1 :(得分:67)

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

请参阅:Adapter patternFacade pattern

答案 2 :(得分:39)

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

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 ;

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

答案 3 :(得分:17)

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

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

干杯!

答案 4 :(得分:8)

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

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

答案 5 :(得分:8)

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

请参阅我对“How do the Proxy, Decorator, Adaptor, and Bridge Patterns differ?

的回答

答案 6 :(得分:7)

值得注意的是,在某些环境中,包装类可能会做的很多事情都被方面所取代。

编辑:

一般来说,包装器会扩展包装器的功能,而不用担心包装器的实现,否则没有必要包装而不是扩展包装类。一个典型的例子是在一些其他服务接口周围添加定时信息或记录功能,而不是将其添加到该接口的每个实现。

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

答案 7 :(得分:7)

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

答案 8 :(得分:5)

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

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

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

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

答案 11 :(得分:3)

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

我目前使用了一个包装类来实现我的项目以及我获得的主要好处(只是扩大主题解释的一个好处):

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

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

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

隐藏细节:如果您正在生成另一个程序员将​​要使用的类,那么您可以包含诸如“错误处理,异常处理,记录消息等......”之类的详细信息,以便程序员不会必须处理混乱,只需使用方法。

答案 15 :(得分:-1)

包装类是一个类,其唯一目的是保存某些内容并为其添加一些功能。 在Java中,因为基元(如整数,浮点数,字符......)不是对象,所以如果你想将它们视为一个,那么你必须使用包装类。 假设您要创建一个向量的向量,问题是向量只保存对象而不是基元。所以你要做的就是将所有的内容放在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();

答案 16 :(得分:-8)

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