javabeanとatribute


以前はjavabeanを無視していましたが、書くのが簡単なget以外にsetはあまり使われていませんでした。最近はアトリブを探索するの中で、振り返ってみたらjavabeanが急に似ています。もしかしたらyui 3 atributeはjavabean component modelの影響を受けているのかもしれません。
PS:ここで言っているのはEJBではなく、from core java 2:
Weic'd like to address a compone before going any further:The JavaBens that we discuss in this chapter have live litle in common with“Enterpris JavaBens”or EJB.Eterpris JavaBens are server-side components,appration,appration,Instration,apt.Eversity.Eversity.Eversity.Eversity.Eversity.Everside Java.Everside JavaBerre。they too are components that can be maipulated in builder tools.However,the Enterpris JavaBens technology is quite a bit more complex the「Standard Edition」JavaBens technology.
That does not mean that standard Java Beans components are limited to client-side programming.Web technologies such such as JavaServer Faces(JSF)and JavaServer Pages(JSP)rely heavilon the Java compone.mont.mont.
1.ゲターセッター
C〓〓〓と違って属性定義getterができます。setter以降は直接属性アクセスをコントロールできます。javaではまだ伝統的な使用属性アクセス方法です。直接アクセス属性のコントロールを提供していません。現在広く実現されているecmascript 3と類似しています。だからyui 3 atributeもアナログjavaと同じです。getterを提供しました。setterは方法で属性のアクセスを制御し、javaに類似しています。ccaは属性要素定義をjavascript類に定義しています。javabean getter、setterは言語レベルの提供です。
 
public class TestAttr extends Attribute {
	private String test = "5";

	public String getTest() {
		System.out.println("i am reading ...");
		return test;
	}

	public void setTest(String test) {
		System.out.println("i am writing");
		this.test = test;
	}
}
 
一方、継承を使用すると、java言語レベルは、相続チェーン上の属性初期化を保証し、yui 3 atributeはBaseシミュレーションによって初期化された。
2.属性変化イベントのトリガ
yui 3 atributeはsetパッケージを通して内部属性値を設定する前後に、beforeおよびafterイベントをトリガし、beforeイベントによって属性の真の有効な書き込みを阻止することができますが、javabean component modelはPropty Change Support(書き込み後通知)とVetoable Change Support(阻止用)を直接提供します。実はjavaは反射機構があるので、yui 3 atributeのsetパッケージを簡単にシミュレートできます。
 
public class Attribute {
        private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
	private VetoableChangeSupport vetoSupport = new VetoableChangeSupport(this);

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		changeSupport.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		changeSupport.removePropertyChangeListener(listener);
	}


	public void addVetoableChangeListener(VetoableChangeListener listener) {
		vetoSupport.addVetoableChangeListener(listener);
	}

	public void removeVetoableChangeListener(VetoableChangeListener listener) {
		vetoSupport.removeVetoableChangeListener(listener);
	}

	public void set(String name, Object newValue) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, PropertyVetoException {
		Object oldValue = BeanUtils.getProperty(this, name);
		vetoSupport.fireVetoableChange(name, oldValue, newValue);
		BeanUtils.setProperty(this, name, newValue);
		changeSupport.firePropertyChange(name, oldValue, newValue);
	}
}
 
3.テスト
 
簡単な例でこのモードとyui 3 atributeの類似性を検証できます。
 
	public static void main(String[] args) throws InvocationTargetException,
			PropertyVetoException, NoSuchMethodException, IllegalAccessException {
		TestAttr t = new TestAttr();

		t.addVetoableChangeListener(new VetoableChangeListener() {
			//         
			public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
				System.out.println(evt.getNewValue());
				System.out.println(evt.getOldValue());
				//      , throw
				//throw new PropertyVetoException("",null);
			}
		});

		t.addPropertyChangeListener(new PropertyChangeListener() {
			//       
			public void propertyChange(PropertyChangeEvent evt) {
				System.out.println(evt.getNewValue());
				System.out.println(evt.getOldValue());
			}
		});
		//System.out.println(t.getTest());
		t.set("test", 2);
		//System.out.println(t.getTest());
	}
 
 
PS:
IE 9はサポートしませんdefineGetter_,次に、ES 5 APIをサポートするLink  MSDN