Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是javabean?_Java_Javabeans - Fatal编程技术网

什么是javabean?

什么是javabean?,java,javabeans,Java,Javabeans,可能重复: 什么是javabean?它是用来干什么的?还有哪些代码示例?我听说它是用来处理getter和setter方法的?我对什么是JavaBean以及在哪里访问它感到非常困惑。我在谷歌上搜索了它,但找不到确切的答案。JavaBean是一个普通的Java类,它的公共getter和setter方法具有私有属性 JavaBean通常用作助手类 示例- public class User implements java.io.Serializable { private String n

可能重复:


什么是javabean?它是用来干什么的?还有哪些代码示例?我听说它是用来处理getter和setter方法的?我对什么是JavaBean以及在哪里访问它感到非常困惑。我在谷歌上搜索了它,但找不到确切的答案。

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

JavaBean通常用作助手类

示例-

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,这是非常有用的


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;
    }
}
提及

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

如果可序列化类未显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化过程中可能会导致意外的InvalidClassException。因此,为了保证不同java编译器实现之间的SerialVersionId值一致,可序列化类必须声明显式的SerialVersionId值。还强烈建议显式serialVersionUID声明在可能的情况下使用private修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID字段不可用作继承成员。数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但数组类不需要匹配serialVersionUID值。


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

如果您谈论的是java beans而不是EJB beans,那么下面是解释

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

2.JavaBean有一组属性

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

第三点说明了一个java类,该类包含私有实例变量和公共getter、setter。

例如:


JavaBeanAPI定义了许多关于JavaBean的约定。根据维基百科:

所需公约如下:

  • 该类必须具有公共默认构造函数(无参数)。这允许在编辑和激活框架内轻松实例化
  • 必须使用get、set、is(用于布尔属性而不是get)和其他方法(所谓的 访问器方法和mutator方法),遵循标准命名 惯例。这允许轻松地自动检查和更新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

公共默认构造函数呢?@IlyaBuziuk根据,如果没有明确定义公共默认构造函数,Java将自动提供该构造函数。我认为这意味着您应该安全地在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;
  }
}