【问题标题】:Java compare the elements of a classJava比较一个类的元素
【发布时间】:2017-08-11 13:01:39
【问题描述】:

我有一个类名“Users”,并且有 2 个元素 (int)userId 和 (String)userName。

我们说

Users obj1 = new Users(10, "User1");
Users obj2 = new Users(11, "User2");

所以我想比较 obj1 和 obj2 逐个元素

10 与 11 相比, “User1”与“User2”比较。

根据我在网络上所做的研究。将其转换为二维数组进行比较或任何方法似乎都无法做到。有什么方法可以做这种事情吗?

我实际上想做一个审计跟踪,所以我在更改之前和更改之后都有对象,所以任何已更改的元素都会在 audit_trail 表中插入一条新记录,其中包含前值和后值。

我是编程新手,我尽力想办法,但它不起作用。 SQL有没有其他方法可以做到这一点?我使用 ng-admin 作为(前端)和 API java http 进行更新(后端)。

【问题讨论】:

  • 覆盖你的班级用户中的等于

标签: java mysql sql object jakarta-ee


【解决方案1】:

您需要实现Comparable<Users> 接口。如果你也想要相等检查,那么你必须覆盖

boolean equals(Object) 

int hashCode()

阅读:

https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Why do I need to override the equals and hashCode methods in Java?

【讨论】:

    【解决方案2】:

    根据您的问题,我们可以比较两个不同的对象。 请在 Comparable<Users> 中实现 equals 方法来执行您的操作。

    下面举例说,

    Class obj1 = new Class(1, "raja");
    Class obj2 = new Class(2, "thiru");
    

    id 和 name 是类的公共变量。那么

    将函数重写为,

    public boolean equals(Object obj) 
    {
        return (this.id == obj.id && this.name.equals(obj.name.equals));
    }
    

    谢谢。

    【讨论】:

      【解决方案3】:

      您应该重写.equals() 方法,使您的Users 类如下:

      public class Users {
          private int mId;
          private String mName;
      
          public Users(int pId, String pName) {
              mId = pId;
              mName = pName;
          }
      
          public int getId() {
              return mId;
          }
      
          @Override
          public boolean equals(Object pObject) {
              return (pObject instanceof Users && ((Users) pObject).getId() == mId);
          }
      }
      

      【讨论】:

        【解决方案4】:

        我可能会创建一个BeanDelta 对象

        public class PropertyDelta {
            private String propertyName;
            private Object value1;
            private Object value2;
        
            // constructor & getters
        }
        
        public class BeanDelta<T> {
            private Class<T> type;
            private List<PropertyDelta> propertyDeltas = new ArrayList<>();
        
            public BeanDelta(Class<T> type) {
                this.type = type;
            }
        
            // getters
        }
        

        然后你可以写一个基于反射的方法

         public <T> BeanDelta<T> getDelta(T o1, T, o2) {
             Class<T> type = o1.getClass();
             Method[] methods = type.getMethods();
             BeanDelta<T> delta = new BeanDelta<>(type);
             for (Method meth : methods) {
                 boolean isGetter = method.getParameterTypes().length == 0 && !method.getReturnType().equals(void.class) && meth.getName().startsWith("get");
                 if (isGetter) {
                     Object v1 = meth.invoke(o1);
                     Object v2 = meth.invoke(o2);
        
                     if (!Objects.equal(v1, v2)) {
                         String propertyName = meth.getName().substring(3);
                         delta.propertyDeltas.add(new PropertyDelta(propertyName, v1, v2));
                     }
                 }
             }
             return delta;
         }
        

        【讨论】:

          【解决方案5】:
          猜你喜欢
          • 1970-01-01
          • 2022-10-15
          • 1970-01-01
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多