java.beans中PropertyChangeSupport使用实例

本文介绍了一个简单的Java Bean实现,该Bean包含姓名和性别两个属性,并通过PropertyChangeSupport实现了属性改变时的通知功能。同时,提供了一个监听器示例,用于接收并打印属性变更的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;


public class MyBean{
      private String name = "redheart";
      private String sex = "男";
      private PropertyChangeSupport support = new PropertyChangeSupport(this);
      public void setName(String newname){
             String oldname = this.name;
             this.name = newname;
             support.firePropertyChange("name", oldname, newname);
             }
      public String getSex() {
		return sex;
	}
	public void setSex(String newsex){
          String oldsex = this.sex;
          this.sex = newsex;
          support.firePropertyChange("sex", oldsex, newsex);
          }
      public String getName(){
             return name;
      }
      public void addPropertyChangeListener(PropertyChangeListener listener) {
       support.addPropertyChangeListener(listener);
    }
 
    public void removePropertyChangeListener(PropertyChangeListener listener) {
       support.removePropertyChangeListener(listener);
    }
}


import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class UseMybean implements PropertyChangeListener
{ 
	private static  MyBean bean = new MyBean();
    public static void main(String [] args)
   { 
    	UseMybean usebean = new UseMybean();
       bean.addPropertyChangeListener(usebean);
       bean.setName("bluesky");
       bean.setSex("女");
       System.out.println("打印我的名字:"+bean.getName());
       System.out.println("打印我的姓别:"+bean.getSex());
   }
    
   public void propertyChange(PropertyChangeEvent e)
   {
	   
    if (e.getSource() == bean) 
     {
    	  //System.out.println("旧的名字:"+e.getPropertyName());
       System.out.println("旧的"+e.getPropertyName()+":"+e.getOldValue().toString());
       System.out.println("新的"+e.getPropertyName()+":"+e.getNewValue().toString());
     }
    }
 
} 

 

package com.example.kucun2.entity.data; import android.util.Log; import com.example.kucun2.entity.Information; import com.example.kucun2.function.MyAppFunction; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; public abstract class SynchronizableEntity implements EntityClassGrassrootsid { public boolean isPreservedObject() { return this.getId() != null && this.getId() == -1; } public enum SyncState {NEW, MODIFIED, DELETED, SYNCING, PRESERVED} SyncState state = SyncState.NEW; private static boolean syncEnabled = true; public static void setSyncEnabled(boolean enabled) { syncEnabled = enabled; } // 设置状态的方法 public void setState(SyncState state) { this.state = state; } public SyncState getState() {return this.state; } // 使用标准属性变更支持类 private transient PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); // 属性缓存(可选,用于优化) private final Map<String, Object> propertyCache = new HashMap<>(); // 添加属性变更监听器 public void addPropertyChangeListener(PropertyChangeListener listener) { if (changeSupport == null) { changeSupport = new PropertyChangeSupport(this); } changeSupport.addPropertyChangeListener(listener); } // 移除属性变更监听器 public void removePropertyChangeListener(PropertyChangeListener listener) { if (changeSupport != null) { changeSupport.removePropertyChangeListener(listener); } } // 触发属性变更通知(子类在setter中调用) protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { if (changeSupport != null && changeSupport.hasListeners(propertyName)) { // 更新属性缓存(可选) propertyCache.put(propertyName, newValue); // 触发变更事件 changeSupport.firePropertyChange(propertyName, oldValue, newValue); } } // 获取属性当前值(可选,用于setter中获取旧值) protected <T> T getCachedProperty(String propertyName) { return (T) propertyCache.get(propertyName); } // 初始化属性缓存(可选,在构造函数中调用) protected void initPropertyCache() { // 初始化所有字段到缓存 for (java.lang.reflect.Field field : getClass().getDeclaredFields()) { try { field.setAccessible(true); propertyCache.put(field.getName(), field.get(this)); } catch (Exception e) { // 忽略初始化异常 } } } /** * 添加url * * @param type 操作增删改查 * @return 返回相对url */ public String getEndpoint(String type) { //从String.xml获取url Log.d("getEndpoint", "getEndpoint: " + "url_" + type + "_" + this.getClass().getSimpleName().toLowerCase()); return MyAppFunction.getStringResource("string", "url_" + type + "_" + this.getClass().getSimpleName().toLowerCase()); } public void sync(SyncCallback callback) { if (!syncEnabled) return; // 全局控制开关 try { switch (this.state) { case NEW: createToServer(callback); break; case MODIFIED: updateToServer(callback); break; case DELETED: deleteFromServer(callback); break; } } catch (Exception e) { Log.e("SyncError", "Sync failed for " + getClass().getSimpleName(), e); } } /** * * 创建实体到后端 * @param callback 回调函数 */ private void createToServer(SyncCallback callback) { String endpoint = MyAppFunction.getStringResource("string", "url") + getEndpoint("add"); Information<SynchronizableEntity> requestData = new Information<>(200, "Create request", this); ApiClient.post(endpoint, requestData, new ApiClient.ApiCallback<SynchronizableEntity>() { @Override public void onSuccess(Information<SynchronizableEntity> response) { if (response.getData() != null) { // 设置服务器返回的ID setId(response.getData().getId()); // 创建成功后状态改为MODIFIED state = SyncState.MODIFIED; if (callback != null) callback.onSyncSuccess(SynchronizableEntity.this); Log.d("SyncCreate", "Successfully created: " + getId()); } } @Override public void onError(int statusCode, String error) { if (callback != null) callback.onSyncSuccess(SynchronizableEntity.this); } }); } /** * 更新实体到后端 */ private void updateToServer(SyncCallback callback) { String endpoint = MyAppFunction.getStringResource("string", "url") + getEndpoint("update") + "/" + getId(); Information<SynchronizableEntity> requestData = new Information<>(200, "Update request", this); ApiClient.put(endpoint, requestData, new ApiClient.ApiCallback<SynchronizableEntity>() { @Override public void onSuccess(Information<SynchronizableEntity> response) { if (callback != null) callback.onSyncSuccess(SynchronizableEntity.this); Log.d("SyncUpdate", "Successfully updated: " + getId()); } @Override public void onError(int statusCode, String error) { if (callback != null) callback.onSyncSuccess(SynchronizableEntity.this); } }); } /** * 从后端删除实体 */ private void deleteFromServer(SyncCallback callback) { String endpoint = MyAppFunction.getStringResource("string", "url") + getEndpoint("delete") + "/" + getId(); ApiClient.delete(endpoint, new ApiClient.ApiCallback<Void>() { @Override public void onSuccess(Information<Void> response) { if (callback != null) callback.onSyncSuccess(SynchronizableEntity.this); Log.d("SyncDelete", "Successfully deleted: " + getId()); } @Override public void onError(int statusCode, String error) { if (callback != null) callback.onSyncFailure("Create failed: " + error); } }); } /** * 将实体转换为请求映射 */ protected Information<SynchronizableEntity> toRequestMap() { return Information.newSuccess(this); } private final Object syncLock = new Object(); private final List<SyncCallback> pendingCallbacks = new ArrayList<>(); public void syncWithDependency(SyncCallback callback) { synchronized (syncLock) { if (state == SyncState.SYNCING) { // 如果正在同步,将回调加入队列 pendingCallbacks.add(callback); } else { // 否则立即执行同步 sync(new SyncCallback() { @Override public void onSyncSuccess(SynchronizableEntity entity) { callback.onSyncSuccess(entity); processPendingCallbacks(); } @Override public void onSyncFailure(String error) { callback.onSyncFailure(error); processPendingCallbacks(); } }); } } } private void processPendingCallbacks() { synchronized (syncLock) { for (SyncCallback callback : pendingCallbacks) { sync(callback); } pendingCallbacks.clear(); } } /** * 获取当前实体依赖的其他实体(需要先同步的实体) */ public List<SynchronizableEntity> getDependencies() { List<SynchronizableEntity> dependencies = new ArrayList<>(); for (Field field : this.getClass().getDeclaredFields()) { field.setAccessible(true); try { Object value = field.get(this); // 处理直接引用的实体 if (value instanceof SynchronizableEntity) { SynchronizableEntity entity = (SynchronizableEntity) value; if (!entity.isPreservedObject() && entity.requiresSync()) { dependencies.add(entity); Log.d(this.getClass().getName(), "getDependencies: "+entity); } } // 处理实体列表 else if (value instanceof List) { for (Object item : (List<?>) value) { if (item instanceof SynchronizableEntity) { SynchronizableEntity entity = (SynchronizableEntity) item; if (!entity.isPreservedObject() && entity.requiresSync()) { dependencies.add(entity); } } } } } catch (IllegalAccessException e) { // 忽略访问异常 } } return dependencies; } /** * 检查实体是否需要同步 */ boolean requiresSync() { return state == SyncState.NEW || state == SyncState.MODIFIED; } private Integer floor; /** * 带依赖关系的同步方法 */ public void syncWithDependencies(SyncCallback callback,Integer... floo) { // // 获取所有依赖实体 // if (floor==null){floor=0;}else if (floor>0){ // return; // }else { // // floor++; // } Log.d(this.getClass().getName(), "syncWithDependencies: "+floor+"_____________________"+ getDependencies()); List<SynchronizableEntity> dependencies = getDependencies(); // 如果没有依赖,直接同步当前实体 if (dependencies.isEmpty()) { sync(callback); return; } // 使用计数器跟踪未完成的依赖同步数量 AtomicInteger remaining = new AtomicInteger(dependencies.size()); SyncCallback depCallback = new SyncCallback() { @Override public void onSyncSuccess(SynchronizableEntity entity) { if (remaining.decrementAndGet() == 0) { // 所有依赖同步完成,同步当前实体 sync(callback); } } @Override public void onSyncFailure(String error) { if (callback != null) { callback.onSyncFailure("Dependency sync failed: " + error); } } }; // 同步所有依赖实体 for (SynchronizableEntity dep : dependencies) { if (floo!=null&&floo.length>0) { if(floo[0]<1) { dep.syncWithDependencies(depCallback, floo[0]++); }else { return; } }else { dep.syncWithDependencies(depCallback,0); } } floor=null; } public interface SyncCallback { void onSyncSuccess(SynchronizableEntity entity); void onSyncFailure(String error); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SynchronizableEntity entity = (SynchronizableEntity) o; return Objects.equals(getId(), entity.getId()); } } 简化结构并添加详细注释,不用改逻辑
最新发布
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值