我们应该使用收集,获取和设置吗?

时间:2012-11-03 12:45:24

标签: java performance getter-setter

我正在阅读一本java书,其中说当访问/修改不同类中的变量时,应该使用get / set方法来操作它们。

我的问题是,加班和使用获取/设置的大型项目不会危及应用程序的性能?

类似的问题,通常我们应该更好地使用数组而不利于更抽象的数据类型(比如实例的类似列表),因为数组通常更加缓存友好。

5 个答案:

答案 0 :(得分:5)

除非您正在编写必须在某些嵌入式设备中运行的高效算法的一些关键部分,否则您的第一个目标应该是生成简单,可读,可维护的代码。在这方面,OOP通过封装等一些功能帮助我们。 getter和setter允许封装一些行为。它们也是几种Java技术(如JSP EL,各种脚本语言,IDE等)使用的标准。性能不应该是一般的主要设计因素。

Java及时编译器非常聪明,并且会内联调用getter和setter。

像Java集合这样的高级抽象也有助于编写更简单,更安全的代码,并且已经过测试和优化。重新实现它们提供的所有数组将导致难以维护,低效的代码。绝对使用Java集合,而不是数组。

请记住,与有点慢的正确代码相比,有效的错误代码是无用的。

答案 1 :(得分:2)

  

我的问题是,加班和使用获取/设置的大项目不会   危及应用程序性能?

不。它促进了数据封装,是一个很好的面向对象实践。

  

软件对象在概念上类似于现实世界的对象:它们   也包括国家和相关行为。对象存储其状态   in fields(某些编程语言中的变量)并公开它   通过方法行为(某些编程语言中的函数)。   方法在对象的内部状态上运行并作为主要状态   对象到对象通信的机制。 隐藏内部状态   并要求所有交互都通过一个对象来执行   方法被称为数据封装 - 一个基本原则   面向对象的编程。

来自Java Trail

  

我们是否应该更多地使用数组而不利于更抽象的数据   type(实例的类似列表),因为数组通常更多   缓存友好。

这取决于您的使用案例   我认为通过缓存友好意味着更高的内存效率。 删除元素时会涉及一些碎片,并且阵列的设计也具有一定的初始容量。在ArrayList中,它以10开头,然后根据您的需要不断调整大小。

但是,使用数组的好处在于您可以按索引访问元素。

答案 2 :(得分:1)

这个词是封装。使用getset可以更轻松地控制对变量的访问(例如,检查值是否在范围内,同步,控制何时更改 - 对于并发编程中的竞争条件有用 - ,使用它们的线程有权这样做,等等。特别是对于大型项目而言,这比开销很小很重要。

此外,getset定义了Java bean,它们被许多框架(JPA,JSF等)使用。

数组是可以的,但是如果你不知道数组的确切大小,那么要么在空单元格中浪费内存,要么经常调整它们的大小,这会增加代码的复杂性。

答案 3 :(得分:1)

我不记得上次我在Java中使用数组了。我总是使用像ArrayList或类似的集合。当你使用像图像这样的原始字节时,会更多地使用数组。在内部,集合是使用数组实现的,因此它与addputget,删除等其他方法基本相同。

回答getter/setter问题,如果你正在编写一个供其他人使用的库,你必须使用getter和setter。不应该通过简单的属性(new A().property)访问用户将使用的接口或层,这是一个非常糟糕的设计,因为您没有封装任何东西。即使您的模块是私有的并且仅由您的应用程序使用,您必须在前端层使用getters/setters。如果一个类是内部的,并且无法从模块/包外部访问,则可以通过属性访问它,但最好是封装。我通过属性访问的唯一情况是我在公共类中有私有类。我使用属性从公共访问私有类。例如:

public class A{
    B b = new B ();

    private class B{
        String asd = "asd";
    }

    public String a (){
        return b.asd;
    }
}

答案 4 :(得分:1)

如果你正在构建一个数据对象,其唯一目的是获取和设置字段,那么getter和setter是个好主意。它们允许您在必要时进行验证和同步,甚至可以在不破坏旧代码的情况下更改字段(只需更改字段并保持API不变)。

在大多数情况下(如果不是所有其他情况),getter和setter都是糟糕的想法。问题甚至与性能无关。问题是,在上述数据对象之外, getter和setter打破封装几乎与直接暴露底层变量本身一样糟糕。如果你有可见变量,那么使用get / set方法;但是,在大多数情况下,您不必拥有可见变量。

消费者不应该关心,或者在大多数情况下甚至知道,关于类包含的变量。这就是封装的本质 - 不是这种被误导的“隐藏变量背后隐藏变量”的概念,而是“隐藏变量,期间”。你绝对不应该设置他们;管理变量是类的责任,如果用户在使用之前必须为其设置类的操作参数,那么类就会被破坏。如果调用者在调用方法后必须getAnything(),则方法签名是错误的; 他们得到的东西应该是一个返回值

只有当该字段是数据时,才应该考虑公开成员变量,无论是通过getter / setter还是仅通过使该字段公开。其他所有情况都需要更好的封装。

对于数组与集合,这取决于具体情况。我个人喜欢在两者都有意义时使用收藏品,但这是个人喜好。在决定这一点时,缓存局部性等问题不应成为您的首要考虑因素。但请记住,在大多数情况下,ArrayList与普通旧数组一样对缓存友好。如果您定义要接受的内容并返回List,那么您可以随意切换List子类型,因为您发现特定的子类型现在更适合您的需求。只是您尝试将API的数组返回值切换到链接列表而不破坏现有代码。 :)