有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中对象上的循环

可以用几种不同的类型循环一个对象吗?例如(字符串、整型、布尔型)

我希望避免方法display()带有几个prints

   public class Personage {
    
      public String name; 
      public int age;
      public boolean sex = false; 
    
    
      public Personage(String name, int age, boolean sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
      }
    
      public void display(){
        System.out.println("Name : " + name);
        System.out.println("Age : " + age);
        System.out.println("Sex : " + sex);
      }
    
    }

在nodeJS中,存在一个名为foReach的循环以实现以下目的:

var perso1 = {
    name : "Toto",
    sex : true,
    age : 30
}

for(var information in perso1){
    console.log(information + " : " + perso1[information]);
}

你认为用Java做同样的事情是可能的吗


共 (3) 个答案

  1. # 1 楼答案

    最简单的方法是向Person类中添加^{}方法并使用reflection。这将导致以下代码:

    public class Personage {
    
        public String name;
        public int age;
        public boolean sex = false;
    
        public Personage(String name, int age, boolean sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
    
            for (Field f: getClass().getDeclaredFields()) {
                try {
                    builder.append(f.getName()).append(": ").append(f.get(this)).append("\n");
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace(); // should be handled
                }
            }
    
            return builder.toString();
        }
    }
    

    之后,可以使用以下代码输出对象:

    System.out.println(new Personage("test", 18, true));
    

    我也可以推荐library Lombok。它还包含一个注释^{},您可以用它来解决问题。例如,您的代码可能如下所示:

    @AllArgsConstructor
    @ToString
    public class Personage {
    
        public String name;
        public int age;
        public boolean sex = false;
    }
    

    否则有many other nice annotations对你有用

  2. # 2 楼答案

    根据你的问题和你给出的代码,循环使用不同的数据类型似乎不太正确

    我已经给出了代码,通过它你可以得到你想要的输出,并且避免了使用几个打印语句的显示方法

    class Personage {
    
        public String name; 
        public int age;
        public boolean sex = false; 
    
        public Personage(String name, int age, boolean sex){
          System.out.println("Name : " + name);
          System.out.println("Age : " + age);
          System.out.println("Sex : " + sex);
        }
    
        //public void display(){
           //System.out.println("Name : " + name);
           //System.out.println("Age : " + age);
           //System.out.println("Sex : " + sex);
        //}
    
    }
    public class Personage2 {
    
        public static void main(String[] args) {
            Personage ob = new Personage("Mark", 23, true);
            Personage ob2 = new Personage("Ruffalo", 26, false);
            //you can declare as many as objects using the Personage constructor 
            // with different data each time as you want
        }
    
    }
    

    它只关心通过对象声明传递给构造函数的数据类型

    Personage("Mark", 25, true);
    

    可以通过构造函数参数处理这些数据类型

  3. # 3 楼答案

    如果您只想显示属性,无论其格式如何,都可以使用lombok @ToString或Apache Common Lang ReflectionToStringBuildr中的库,或者您可以通过IDE生成

    但是,如果你想知道如何用JavaScript实现这一点,有两种方法:

    1. 如果所有字段都是公共字段:
            YourPojo object = ...
            Field[] declaredFields = object.getClass().getDeclaredFields();
            for(Field field : declaredFields){
                String fieldName = field.getName();
                Object value = field.get(object);
                System.out.println(fieldName + " = " + value);
            }
    
    1. 如果字段是私有的,并且使用公共getter:
            YourPojo object = ...
            Method[] declaredMethods = object.getClass().getDeclaredMethods();
            for(Method method : declaredMethods){
                if(method.getName().startsWith("get")){
                    String propertyName = method.getName().substring(3);
                    Object value = method.invoke(object);
                    System.out.println(propertyName + " = " + value);
                }
            }
    

    可以创建Utils类,使其可用于任何对象