2

我正在编写一个代表一些简单几何图形的 Java 类。

在最顶层的abstract类(它本身是package-private)我已经声明了我需要从同一个包中的子类访问的属性。

final如果我在 中声明一个属性AbstractClass

final int foo;

我将能够直接在包中访问它,而无需对 getter 方法大惊小怪。然而。根据“实践”(或我认为是常见的风格)做的将是:

private final int foo;

这当然需要一个非private吸气剂。子类必须引用foo(这是一个非常相关且典型的属性),就好像它是某个外部对象一样:

this.getFoo();

它添加代码并删除访问这些成员的直接方式(即foo)。

跳过修饰符是否有任何缺点private,因为它们无论如何都是最终的,我不担心在包内部暴露这些属性?

我知道 OO 拥护者声称 getter/setter 是对象访问它们自己的属性的一种非常自然的方式——但这什么时候会使任何非装饰性的、非 [插入任何 JavaBeans 样式的东西] 有所不同?

考虑一个内部类 ,Coordinate它非常简单,因为它有两个int属性 - 将所有用法留给 class OuterClass

class OuterClass{
    final static class Coordinate{
        final int x, y;
        Coordinate(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    Coordinate coordinate;
}

对于这个内部类 - 我为什么要为创建吸气剂的实践而烦恼?getter 会引入更多代码并强制同一包中的任何类调用coordinate.getX();而不是简单地调用coordinate.x;. 这里有开销吗?注意finalclass 上的修饰符Coordinate

4

3 回答 3

6

getter 的优点是将接口与实现解耦。今天你getFoo可能除了 return 什么都不做foo,但将来你可能想要,例如,远程foo成员并返回一个计算结果。getter 将允许您这样做,而无需在每个调用站点进行更改。

于 2012-11-26T01:12:47.663 回答
2

如果您要从 JSF Page 访问该值,它将期望 getFoo 而不仅仅是 foo(即使您编写了object.foo)。

除此之外 - 今天这个领域是最终的,从现在起很长一段时间它可以改变(我猜)。即使机会非常接近于 0,我相信遵循良好做法也不会过大。在大多数情况下,您进行更改而不是从头开始编写代码,因此尽可能保护自己要好得多(如果只需要编写private并且在 Eclipse 的情况下大约 4 次单击以自动生成 getter 和 setter)。

于 2012-11-26T01:49:22.967 回答
0

扩展 Feldgendler 的答案(提供的信息可能对需要回答这个问题的人有用——我相信这是相关的,因为它确实是一个关于封装的问题):

在使用private修饰符的作用下,您将不得不创建“​​getter”(例如int getX(){ ... })来维持访问。可以在已实现的interface. Javainterface不允许声明实例变量,例如--- 或任何final int x;其他缺少static修饰符的变量的示例。该接口将充当任何实现类将具有的行为的声明。

如果实施如下:

Coordinate implements ICoordinate { ... }

它在许多情况下可能很有用:

接口的使用

  • API 的自文档。
    • 易于阅读、记录和管理。
    • 因此,允许多个实现易于使用和交换。
    • 在基于组件的设计等方面:提供明确的方法来提供要求所描述的行为,而无需实际准备好任何实现代码。
      • 示例:然后可以创建一个提供接口的数据库组件。John Doe 想要编写一个将来使用数据库的程序。然而,现在使用其他一些更简单的存储形式就足够了。为了在这一天到来时不重新编码已经工作的代码,John 可以使用方法实现一个接口(可能给出名称interface IDatabase),void insert( ... ); Object get( ... );也许还有更多方法——然后实现他的临时解决方案。这一天到来了,他现在拥有一个实现相同功能的数据库interface IDatabase。要切换到新数据库,他可能只需要更改*一行代码*(例如构造函数调用)!
  • 一个例子:http: //pastebin.com/vvV2Nck8

使用私有修饰符

  • 阐明了课程的意图!就像界面一样,它具有自我记录的性质。(它在安全方面没有价值)
    • private修饰符意味着它不会被超出范围访问。或者等价地——只能在一定范围内访问。当然同样适用于public, "package-private" (没有修饰符暗示 package-private) 和protected.
    • 访问属性不会明确告诉调用者它是什么类型的变量。有一个 getter 但没有 setter 说别的东西......
    • 注意:对于常量(例如static final double LIGHT_SPEED),有合理的理由省略 getter 并使用它public。这只是约定,因为很清楚什么是常数,什么是具有自己成员的对象。
    • 注意2:如果有兴趣,请阅读final关键字及其对优化的影响。它们可以用在方法和属性中。(在 Java 中使用 final 关键字会提高性能吗?是一个例子)
于 2015-02-24T11:37:52.853 回答