只有“Setters”和“Getters”的类 - 优点

时间:2015-05-04 09:07:44

标签: java oop

我经常遇到这样一种情况:API定义了一个类,该类只包含带有适当的setter和getter的字段。

然而,他们有一个特定的角色。因此,从现实生活(OOP)的角度来看,他们实际上 是有意义的。我最后一次偶然发现这是schema in Olingo。它用于设置一些属性。

我的问题是,从技术角度来看,“仅设置变量”是否有任何优势,或者这些类仅用于坚持OOP(并且具有干净的代码等等)?

编辑:请注意,我不是在问为什么我们使用“Setters”和“Getters”。试着从另一个角度来看待它。假设您必须定义三个字符串以在代码中进一步使用它们。您决定创建一个将这三个字符串存储为字段并为它们定义setter和getter的类,而不是将它们定义为“即时”私有字符串。这样做有什么技术优势吗?

“架构”的示例代码:

public List<Schema> getSchemas() throws ODataException {
List<Schema> schemas = new ArrayList<Schema>();

Schema schema = new Schema();
schema.setNamespace(NAMESPACE);

List<EntityType> entityTypes = new ArrayList<EntityType>();
entityTypes.add(getEntityType(ENTITY_TYPE_1_1));
entityTypes.add(getEntityType(ENTITY_TYPE_1_2));
schema.setEntityTypes(entityTypes);

List<ComplexType> complexTypes = new ArrayList<ComplexType>();
complexTypes.add(getComplexType(COMPLEX_TYPE));
schema.setComplexTypes(complexTypes);

List<Association> associations = new ArrayList<Association>();
associations.add(getAssociation(ASSOCIATION_CAR_MANUFACTURER));
schema.setAssociations(associations);

List<EntityContainer> entityContainers = new ArrayList<EntityContainer>();
EntityContainer entityContainer = new EntityContainer();
entityContainer.setName(ENTITY_CONTAINER).setDefaultEntityContainer(true);

List<EntitySet> entitySets = new ArrayList<EntitySet>();
entitySets.add(getEntitySet(ENTITY_CONTAINER, ENTITY_SET_NAME_CARS));
entitySets.add(getEntitySet(ENTITY_CONTAINER, ENTITY_SET_NAME_MANUFACTURERS));
entityContainer.setEntitySets(entitySets);

List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
associationSets.add(getAssociationSet(ENTITY_CONTAINER, ASSOCIATION_CAR_MANUFACTURER, ENTITY_SET_NAME_MANUFACTURERS, ROLE_1_2));
entityContainer.setAssociationSets(associationSets);

entityContainers.add(entityContainer);
schema.setEntityContainers(entityContainers);

schemas.add(schema);

return schemas;
}

添加了一个示例,其中包含我正在质疑的内容。将类“test”视为一个包含两个字段“a”和“b”以及适当的“setter”和“getters”的类。 简单的例子:

public class Main {
    public static void main(String[] args) {

        //Version 1: Common practice

        test asdf = new test();
        asdf.setA("asdf");
        asdf.setB("asdf2");

        //Doing something with "asdf" and "asdf2"

        //Version 2: My request

        String a = "asdf";
        String b = "asdf2";

        //Doing something with "asdf" and "asdf2"

    }
}

4 个答案:

答案 0 :(得分:3)

getter / setter有许多实际的实际优势:

  • 如果您需要为它们添加逻辑(通常是设置器),您可以在不破坏API的情况下执行此操作。

  • 调试时,如果需要知道字段何时更改,可以在设置器中设置断点。

  • 您可以使用界面来定义API。

  • 子类可以为它们添加逻辑。

  • 如果合适,暴露类型的getter / setter可以是所使用的实际字段的更通用或有限版本(例如,getter可以是只读List),允许您更改实施(可能ArrayList成为LinkedList),而不会再破坏您的API。

  • 他们可以代理进行测试。

理论上,现实世界的,实际的缺点是你进行方法调用而不仅仅是设置字段。但是,从性能角度来看,如果它很重要,JVM的即时优化编译器将内联简单的getter / setter。

答案 1 :(得分:0)

绝对有优势。

使用此setter和getter,您可以在监视时允许其他人访问您的属性。

我的意思是,您正在提供受控访问权限。您可以过滤并检查其他对象设置到字段的值。

答案 2 :(得分:0)

使用方法来访问和设置属性(一致性检查,封装......)是很有用的,但是当getter / setter具有默认操作时,必须明确地执行此操作。

许多语言现在使用myObject.attr作为唯一的语法,无论是属性还是getter。如果属性可见,则会自动(并静默)生成默认的getter和setter。 Scala是其中一种语言,对我来说,这是最好的解决方案。

答案 3 :(得分:0)

使用Setter,我们可以抽象出设置变量的逻辑。

对于Ex:最低余额不能为负数。如果我们直接使用变量来设置余额,我们可能会错误地将其设置为负值。这可以通过setter来避免。

public Class Account {

    public int minBalance;

    public void setMinBalance(int amount) {
        if(amount < 0) minBalance = 0;
        else minBalance = amount;
    }
}