我经常遇到这样的情况:API 定义的类仅由其字段以及适当的 setter 和 getter 组成。
但是,它们具有特定的作用。因此,从现实生活 (OOP) 的角度来看,它们实际上是有意义的。我上次偶然发现这个问题是schema in Olingo 。它用于设置一些属性。
我的问题是,从技术角度来看,与“仅设置变量”相比是否有任何优势,或者这些类仅用于坚持 OOP(并且具有干净的代码等)?
编辑:请注意,我不是在问为什么我们使用“Setter”和“Getters”。尝试从另一个角度来看待它。假设您必须定义三个字符串才能在代码中进一步使用它们。您决定创建一个类,将这三个字符串存储为字段并为它们定义 setter 和 getter,而不是将它们定义为“动态”私有(private)字符串。这样做有什么技术优势吗?
“模式”的示例代码:
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"
}
}
最佳答案
getter/setter 在现实世界中有很多实际优势:
如果您需要向它们添加逻辑(通常是 setter),您可以在不破坏 API 的情况下执行此操作。
调试时,如果需要知道某个字段何时发生更改,可以在 setter 中设置断点。
您可以使用接口(interface)来定义您的 API。
子类可以向它们添加逻辑。
如果合适,getter/setter 的公开类型可以是所使用的实际字段的更通用或有限的版本(例如,getter 可以是只读的
List
),允许您更改实现(也许ArrayList
变为LinkedList
),而不会再次破坏您的 API。可以代理它们进行测试。
理论上,现实世界的实际缺点是您要进行方法调用而不仅仅是设置字段。但如果从性能角度来看它很重要,JVM 的即时优化编译器将内联简单的 getter/setter。
关于java - 仅具有 "Setters"和 "Getters"的类 - 优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026366/