当前位置:  开发笔记 > 编程语言 > 正文

Java Beans:我错过了什么?

如何解决《JavaBeans:我错过了什么?》经验,为你挑选了2个好方法。

我想知道我是否遗漏了一些关于Java Bean的东西.我喜欢我的对象在构造函数中尽可能多地进行初始化,并且具有最少数量的mutator.豆似乎直接反对这一点,并且通常感到笨重.我没有将我的对象构建为Beans而错过了哪些功能?



1> erickson..:

听起来你走在正确的轨道上.并不是你错过了Java Beans的观点,而是其他程序员滥用它们.

Java Beans规范旨在与可视化工具一起使用.我们的想法是,应用程序设计人员能够以交互方式配置对象的实例,然后对配置的bean进行序列化(或生成代码),以便可以在运行时重构它; 意图是它不会在运行时发生变异.

不幸的是,很多开发人员都不明白访问者是否违反了封装.他们使用结构而不是对象.他们没有看到其他类,甚至其他包有任何错误,依赖于类的数据成员.

当然,您通常需要配置对象的实例.只是应该通过某种配置功能来完成.这可能是依赖注入容器,"BeanBox"样式可视化工具,或者只是读取您手动编写的JSON,XML或属性文件.关键是在运行时这些对象实际上是不可变的; 客户只是调用他们的操作,他们不访问他们的属性.



2> Dónal..:

我喜欢我的对象在构造函数中尽可能多地进行初始化,并且具有最少数量的mutator.

偏爱不可变对象是明智的选择.但是bean的好处是框架/工具/库可以在运行时确定类的属性,而不需要您实现特定的接口.

例如,假设您有一个Person bean的集合,并且每个bean都具有名称,年龄,身高等属性.

您可以使用以下代码按名称(例如)对此Bean集合进行排序:

Collection myCollection = // initialise and populate the collection
Comparator nameCompare = new BeanComparator("name");
Collections.sort(myCollection, nameCompare);

该BeanComparator类知道如何提取从每个对象的"名称"属性,因为Java Bean约定之后,即你做足了实现接口如"开销":

interface Nameable {
    public String getName();
    public void setName(String name);
}

Spring MVC的另一个例子是存储请求URL参数的bean.这可以在Web控制器中定义(在Struts中称为"Action"),如下所示:

public ModelAndView searchUsers(UserSearchCriteria criteria) {
    // implementation omitted
}

因为UserSearchCriteria应该是一个JavaBean,如果请求URL包含一个参数,例如maxItems=6,Spring框架'知道'它应该调用带有签名的方法

void setMaxItems(int maxItems);

从本质上讲,JavaBeans只是一个简单的约定,允许在运行时(通常通过工具或框架)动态发现类的属性,当不方便/不可能事先知道可能提供的属性时.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有