java - 仅具有 "Setters"和 "Getters"的类 - 优点

标签 java oop

我经常遇到这样的情况: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/

相关文章:

java - 我在 Java 中的 do while 循环有什么问题

java - 在 Hadoop 2.6.0 到 2.7.1 升级上启动 MRAppMaster 时出现 NoClassDefFoundError

java - 复制/粘贴在签名的小程序中不起作用

java - 登录设计器后的 Tooltwist 堆栈跟踪 : "com.dinaa.xpc.XpcConfigException: Unknown user type: ' phinza'"

java - Arrays.asList() 的限制在 Thinking in Java 4th Edition 中不成立

php - 使用键作为数字 PHP 访问对象

C++ header 和声明嵌套结构和类语法

javascript - 这是 JS 中 OOP 的一个很好的示例吗?

javascript - 如何从对象 : Javascript 中获取保存对象实例的变量名

java - 如何将接口(interface)添加到包中?