java - 在 Java-8 中自动将属性名称作为参数传递

标签 java reflection

我想要一种验证字段的方法

protected void validate(String field, String fieldName){
  if (field==null || field.isEmpty){
    throw new IllegalArgumentException("Parameter " + fieldName + " cannot be empty");
  }
}

例如在我的类里面使用

class Foo {
  private String x;
  private String y;

  ...

  public void validateAll(){
    validate(x, "x");
    validate(y, "y");
  }
}

这样使用就太好了

  public void validateAll(){
    validate(x);
    validate(y);
  }

并让编译器自动将变量名称传递给 validate(field, fieldName) 方法

如何在 Java-8 中实现此目的?

最佳答案

您可以在 Java 中实现此目的,方法是放弃使用带有字段的 Java 类的想法,而使用将 Column 对象映射到值的 Map 。从使用的角度来看,它大致如下所示:

public static final Column<String> X_COLUMN = new Column<>( "x", String.class );
public static final Column<String> Y_COLUMN = new Column<>( "y", String.class );
public static final Table FOO_TABLE = new Table( "Foo", X_COLUMN, Y_COLUMN, ... );
...
Row fooRow = new Row( FOO_TABLE );

fooRow.setFieldValue( X_COLUMN, "x" );
String x = fooRow.getFieldValue( X_COLUMN );

for( Column<?> column : fooRow.getTable().getColumns() )
    doSomethingWithField( fooRow, column );

private static <T> void doSomethingWithField( Row row, Column<T> column )
{
    T value = row.getFieldValue( column );
    ...do something with the field value...
}

关于java - 在 Java-8 中自动将属性名称作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39707089/

相关文章:

java - 如何在 Clojure 中从 Java 中声明的字段获取数组元素的类型?

java - Clojure,反射 : Find classes that implement an interface

reflection - 使用反射来传递和修改原语而不使用数组

java - HttpResponse 正文正在更改

java - 使用另一个类中的 jbutton 调用带有绘制和线程的 main 方法

java - 为@Nonnull 注释参数编写单元测试

arrays - 如何使用反射制作多维数组或 slice

java - For 循环头中的循环计算

java - 为什么引用变量在此示例中引用不同的值?

java - 将 Singleton 对象作为枚举元素的 Scala 枚举以及迭代它们的可能性?