繁体   English   中英

如何避免忘记处理属性?

[英]How to avoid forgetting to process properties?

有这个 class

Class Test
{ 
  static int version=1;
  String A;
  String B;

  //constructor
  //setters, getters, etc...      
  public void printAll(void)
  {
     System.out.println(A);
     System.out.println(B);
  }    
}

过了一会儿,我们修改 Class 以添加一个字符串 C:

Class Test
{ 
  static int version=2;
  String A;
  String B;
  String C;

  //constructor
  //setters, getters, etc...      
  public void printAll(void)
  {
     System.out.println(A);
     System.out.println(B);
     //it seems somebody has forgotten to print C!!!!!!!!!

  }    
}

这里有一些已知的方法来避免这种错误吗?

谢谢

代码审查应该会发现这个问题。 除了代码审查之外,单元测试或调试通常会告诉您您的代码是否运行正常。 如果您没有处理某些属性,您的测试应该会失败,因为在某些时候方法/属性/结果将不正确。 除了我认为使用反射的那些事情之外,这太过分了。

我不确定是否推荐,但您可以通过以下方式获取 object 的字段:

import java.lang.reflect.Field;

Field[] fields = object.getClass().getDeclaredFields();
for (int i = 0 ; i < fields.length ; i++)
  System.out.println(fields[i]);

你有一些代码在一个地方添加、删除或修改,会影响到其他地方。 在这种特殊情况下,您的 function 调用所有属性。

您可能想要 C++ 之类的东西,其中类没有像 Java 这样的显式属性,并且使用宏或集合进行模拟。


package mycompany.myapp;

import propertiesgenerics;

Class Test
{ 
  static int version=1;

  public property<String> A;
  public property<String> B;
  public list< property<string> > Properties;

  public Bicycle() {
    public property<String> A = new property<String>();
    public property<String> B = new property<String>();

    Properties.add(A);
    Properties.add(B);
  }


  //constructor
  //setters, getters, etc...      
  public void printAll(void)
  {
    // iterating thru this.properties
    for loop {
     System.out.println(eachProperty);
     } // for loop
  }    
}

如果不是滥用反射的粉丝,因为并非所有字段都被视为属性,并且并非所有属性都被视为字段。

您可以使用org.apache.commons.lang.builder.ToStringBuilder

public void printAll() {
        System.out.println(ToStringBuilder.reflectionToString(this));
}

或者

public void printAll() {
    System.out.println(new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       append("smoker", smoker).
       toString());
}

您可以使用注解以更结构化的方式使用反射,从而更好地控制哪些字段可打印:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@interface Printable { }

class Test {

  @Printable String A;
  @Printable String B;
  @Printable String C;

  public void printAll() {
    for (Field field : getClass().getDeclaredFields()) {
      if (field.isAnnotationPresent(Printable.class)) {
        try {
          System.out.println(field.get(this));
        } catch (Exception e) {
          throw new RuntimeException(e);
        }       
      }
    }
  }

}

有时最好的策略就是将评论放在您的属性列表上方:

// Remember to include any new properties in the printAll method!
String A;
String B;

除此之外,我同意 KyleM 的观点,即代码审查对于发现此类问题至关重要。

我不确定我是否会将健忘视为一个错误。 我认为处理此类问题的最佳方法是使用源代码控制程序,这样您就可以跟踪文件的更改。

http://tortoisesvn.net/ :这是一个很好的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM