[英]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.