有 Java 编程相关的问题?

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

java如何替换不推荐使用的构造函数DynamoDBMapperFieldModel

最近,我不得不维护一个用Java开发的旧项目(这不是我的强项之一),在编译过程中,我收到了一条关于不推荐使用的API的警告

经过调查,我发现不推荐使用的API是AWS的构造函数DynamoDBMapperFieldModel。 在查看文档之后,我没有找到任何关于新构造函数的信息,也没有找到如何通过另一种方式实例化它的信息。 我需要这个构造函数,因为我的类正在实现ItemConverter和方法getFieldModel

下面是我的课程代码:

    @Override
    public DynamoDBMapperFieldModel getFieldModel(Method getter) {

        MethodInfo fieldMeta = meta.get(getter.getDeclaringClass()).get(getter);
        return new DynamoDBMapperFieldModel(getter.toString(), fieldMeta.dynamoDBAttributeType, fieldMeta.marshaller);
    }

SDK的版本如下: com.amazonaws:aws-java-sdk-dynamodb:1.9 com.amazonaws:aws-java-sdk:1.11.15

如果您有任何问题,请告诉我,并感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    免责声明:我的回答基于对1.11.15 found here版源代码的检查。我从来没有使用过这个API,所以我的答案更像是由于没有其他答案而提供的见解

    除了前面提到的deprecated构造函数之外,类DynamoDBMapperFieldModel还提供以下构造函数:

    /**
     * Creates a new field model instance.
     * @param builder The builder.
     */
    private DynamoDBMapperFieldModel(final Builder<T,V> builder) {
        this.id = builder.id;
        this.properties = builder.properties;
        this.reflect = builder.reflect;
        this.converter = builder.converter;
        this.dynamoDBAttributeType = builder.dynamoDBAttributeType;
    }
    

    但是,这个构造函数是private,这意味着不能从类范围外直接调用它。解决方案似乎是使用DynamoDBMapperFieldModel.Builder静态内部类来实例化DynamoDBMapperFieldModel对象。class com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas有一些关于这个习语的示例,例如:

    @Override
    public DynamoDBMapperFieldModel getFieldModel(Method getter) {
        //...
        final StandardAnnotationMaps.FieldMap annotations = StandardAnnotationMaps.of(getter, null);
        final DynamoDBMapperFieldModel.Builder builder = new DynamoDBMapperFieldModel.Builder(void.class, annotations);
        builder.with(attributeType);
        return builder.build();
    }
    

    这个成语很常见,通常被称为Builder Pattern

    值得注意的是,DynamoDBMapperFieldModel。生成器内部类具有“默认可见性”(无显式访问修饰符):

    static final class Builder<T,V> {
        //...
    }
    

    如有必要,您可以选中this tutorial以了解每个可见性修改器的限制

    希望这能帮助您找到最终解决方案