【问题标题】:What is a Java bean? [duplicate]什么是 Java bean? [复制]
【发布时间】:2012-07-10 05:11:55
【问题描述】:

可能重复:
What's the point of beans?

什么是javabean?这有什么用途?还有哪些代码示例?我听说它用于与 getter 和 setter 方法有关的事情?我对 java bean 是什么以及你在哪里访问它感到很困惑。我google了一下,没有找到确切的答案。

【问题讨论】:

  • FWIW,这是我在 Google 上搜索有关 Java Bean 是什么的信息时出现的第一个 Stack Overflow 问题。作为“路标”问题非常有用。

标签: java javabeans


【解决方案1】:

Java Bean 是一个普通的 Java 类,它具有私有属性及其公共 getter 和 setter 方法。

Java Beans 通常用作帮助类。

示例 -

public class User implements java.io.Serializable {

    private String name;
    private Integer age;

    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }

    public Integer getAge(){
        return this.age;
    }

    public void setAge(Integer age){
        this.age = age;
    }
}

实现Serializable 不是强制性的,但如果您想在 Java 内存之外持久化或传输 Javabean,例如,它非常有用。在硬盘中或通过网络。

Places where JavaBeans are used?

【讨论】:

  • 公共默认构造函数呢?
  • @IlyaBuziuk 根据this,如果未明确定义,Java 将自动提供公共默认构造函数。我认为这意味着您应该安全地为您的 bean 定义省略一个。
  • 那么,如果它只是一个普通的类,为什么还要麻烦称它为 bean?我不明白 D:
【解决方案2】:

JavaBeans 是 Java 的可重用软件组件。实际上,它们是用符合特定约定的 Java 编程语言编写的类。它们用于将许多对象封装到单个对象(bean)中,以便它们可以作为单个 bean 对象而不是多个单独的对象传递。 JavaBean 是可序列化的 Java 对象,具有 0 参数构造函数,并允许使用 getter 和 setter 方法访问属性。

优势

  • Bean 获得了 Java“一次编写,随处运行”范例的所有好处。
  • 可以控制暴露给另一个应用程序的 Bean 的属性、事件和方法。
  • 可以提供辅助软件来帮助配置 Bean。
  • Bean 的配置设置可以保存在持久存储中,并且可以在以后恢复。
  • Bean 可以注册以接收来自其他对象的事件,并可以生成发送给它的事件。

缺点

  • 具有空构造函数的类可能会在无效状态下被实例化。如果这样的类是由开发人员手动实例化的(而不是由某种框架自动实例化),开发人员可能不会意识到他已将类实例化为无效状态。编译器无法检测到此类问题,即使已记录在案,也不能保证开发人员会看到文档。
  • 必须为每个属性创建一个 getter,并为许多、大部分或所有属性创建一个 setter,这会产生大量样板代码。

例子:

package beans;

/**
 * Class <code>PersonBean</code>.
 */
public class PersonBean implements java.io.Serializable {

    private String name;

    private boolean deceased;
    static final long serialVersionUID = 1L;

    /** No-arg constructor (takes no arguments). */
    public PersonBean() {
    }

    /**
     * Property <code>name</code> (note capitalization) readable/writable.
     */
    public String getName() {
        return this.name;
    }

    /**
     * Setter for property <code>name</code>.
     * @param name
     */
    public void setName(final String name) {
        this.name = name;
    }

    /**
     * Getter for property "deceased"
     * Different syntax for a boolean field (is vs. get)
     */
    public boolean isDeceased() {
        return this.deceased;
    }

    /**
     * Setter for property <code>deceased</code>.
     * @param deceased
     */
    public void setDeceased(final boolean deceased) {
        this.deceased = deceased;
    }
}

参考http://en.wikipedia.org/wiki/JavaBeans

根据@Andy 的评论,我接受我们应该声明serialVersionUID。根据Java Docs

If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members. Array classes cannot declare an explicit serialVersionUID, so they always have the default computed value, but the requirement for matching serialVersionUID values is waived for array classes.

如果您没有明确指定 serialVersionUID,则会自动生成一个值 - 但这很脆弱,因为它依赖于编译器实现。

【讨论】:

  • 这个例子看起来不正确——“可序列化类 PersonBean 没有声明 long 类型的静态最终 serialVersionUID 字段”
  • @Andy 如果您没有明确指定 serialVersionUID,则会自动生成一个值 - 但这很脆弱,因为它依赖于编译器实现。这就是为什么建议指定。我已经编辑了我的答案,谢谢指出。
【解决方案3】:

嗯,JavaBean API 定义了许多关于 JavaBeans 的约定。根据维基百科:

所需的约定如下:

  • 该类必须具有公共默认构造函数(无参数)。这允许在编辑和激活框架内轻松实例化。
  • 类属性必须可以使用 get、set、is(用于布尔属性而不是 get)和其他方法(所谓 访问器方法和修改器方法),遵循标准命名 惯例。这允许轻松自动检查和更新 bean 框架内的状态,其中许多包括自定义编辑器 各种类型的属性。 Setter 只能接收一个参数。
  • 该类应该是可序列化的。它允许应用程序和框架以可靠的方式保存、存储和恢复 bean 的状态。 时尚独立于虚拟机和平台。

通常,这些是应用程序中最常见的类类型,因为它们可用于对所使用的数据进行建模。下面是一个这样的 bean 的例子:

public class Person implements Serializable
{
  private String name;
  private boolean alive;

  public Person()
  {
    // constructor logic...
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public boolean isAlive()
  {
    return alive;
  }

  public void setAlive(boolean alive)
  {
    this.alive = alive;
  }
}

如您所见,属性反映在 getter 和 setter 中。

HTH

【讨论】:

    【解决方案4】:

    如果您在谈论 java-beans 而不是 EJB Beans,那么这里是解释...

    1. JavaBean 有一个不带参数的构造函数。

    2. JavaBean 具有一组属性。

    3. JavaBean 具有允许访问其底层属性的访问器(getXxx 或 isXxx 用于布尔属性)方法和修改器方法 (setXxx)。

    第 3 点声明了一个带有私有实例变量和公共 getter、setter 的 java 类。

    例如:

    import java.util.Date;
    
    public class User {
        private Date loginDate;
        private String name;
        private String password;
    
        public User() { }
    
        public Date getLoginDate() {
            return loginDate;
        }
    
        public String getName() {
            return name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setLoginDate(Date loginDate) {
            this.loginDate = loginDate;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public void delete() {
            // code to delete user from database
        }
    
        public void update() {
            // code to update user in database
        }
    
        public static User getUser(String name) {
            // code returning a new User object
            // populated from the database
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2011-03-04
      • 2012-09-13
      • 2013-05-28
      • 1970-01-01
      • 2011-04-07
      • 2014-11-01
      • 1970-01-01
      • 2011-02-28
      相关资源
      最近更新 更多