java - public访问 vs 访问器方法

14 浏览
0 Comments

java - public访问 vs 访问器方法

我正在阅读《Java for Dummies 2nd edition》,它说最好为类的变量定义访问器方法,而不是将它们设为public。这是真的吗?

0
0 Comments

在Java中,有时候我们需要在一个类中暴露一些属性供其他类使用。在这种情况下,我们可以选择使用公共访问(public access)或访问器方法(accessor methods)来实现。

公共访问是指直接将属性设置为公共(public)访问级别,使其可以被其他类直接访问和修改。这种方式简单直接,但也存在一些问题。首先,对于属性的修改没有任何限制,其他类可以随意修改属性的值,这可能导致对象的不变性(invariants)被破坏。其次,如果属性的类型是可变的(mutability),其他类可以直接修改属性的状态,可能造成不可预料的后果。

为了解决这些问题,我们可以选择使用访问器方法。访问器方法是指在类中定义一些公共(public)方法,用于获取或修改属性的值。通过访问器方法,我们可以对属性的访问进行控制,确保只返回属性的副本而不是实际对象,从而避免其他类修改属性的状态。这样一来,即使其他类修改了属性的值,也不会影响原始对象的状态。

在PHP(Codeigniter)脚本中,我就是这样做的。

公共访问和访问器方法都可以用来在一个类中暴露属性供其他类使用。但是,公共访问可能会导致属性被随意修改,而访问器方法可以通过返回副本的方式保护属性的状态。因此,在设计类的时候,我们需要根据具体情况选择合适的访问方式。

0
0 Comments

在Java中,我们经常会使用public访问修饰符来控制类的成员的访问权限。然而,有时候我们希望更加灵活地控制其他类对成员的访问方式,这就引发了public访问修饰符与访问器方法之间的问题。

在Java中,我们可以使用访问器方法来间接地访问私有成员。访问器方法通常是一对get和set方法,用于获取和设置成员的值。使用访问器方法的好处是,我们可以在项目的后期随时更改这些方法,而不需要修改整个项目的代码。例如,我们可以从简单地返回成员的值开始,而后在项目的后期根据需要添加更多的控制。这样,我们只需要修改get和set方法,而不需要对整个项目进行重构。

此外,访问器方法还可以通过计算其他数据来返回响应,而不仅仅是返回成员的值。另外,即使我们将初始成员字段重构为一个单独的对象,我们仍然希望在这个更高级的对象上提供访问器方法。如果我们从一开始就使用访问器方法,我们只需要重构提供方的代码,而不需要修改使用方的代码。

因此,使用访问器方法可以让我们更加灵活地控制成员的访问方式,并且可以减少代码重构的工作量。虽然这只是一种约定俗成的做法,但在项目的后期,这种做法可以帮助我们更好地维护和扩展代码。

0
0 Comments

在Java中,我们可以使用公共访问(public access)或访问器方法(accessor methods)来访问类的字段。然而,这两种方法有不同的使用场景和灵活性。

公共访问允许我们直接访问类的字段,这意味着字段可以在任何地方都被读取和写入。这种方式简单直接,但缺乏了一些控制和灵活性。相比之下,访问器方法通过定义公共的读取方法和私有的写入方法,提供了更多的灵活性和控制。

定义访问器方法的一个好处是我们可以将字段设置为公共可读,但仅限于私有可写。这样做的好处是我们可以限制对字段的写入,只允许在类的内部进行。这种方式可以提高代码的安全性和可维护性。

此外,访问器方法还可以提供更好的API。通过使用访问器方法,我们可以将字段的读取和写入操作封装在方法中,使得代码更加清晰和易于理解。这样的API设计可以提高代码的可读性和可维护性。

有人可能会问,Java中是否有类似于"readonly"的关键字来限制字段的只读访问权限?实际上,Java中没有专门的"readonly"关键字。但是,我们可以通过定义公共的读取方法来实现类似的只读访问权限。通过这种方式,我们可以在外部只读取字段的值,而不能修改它。

另外,有人可能会认为使用"final"关键字可以实现只读功能。然而,"final"关键字并不一定意味着只读。它只是表示字段所在的内存块的边界不可改变,但内存块内部的位可以改变。对于原始类型,如int和double,"final"关键字确实可以使值成为常量,因为每个值都被视为相应包装类(Integer和Double)的不同实例。

使用访问器方法可以提供更好的灵活性和控制,使代码更加安全和可维护。通过封装字段的读取和写入操作,我们可以设计出更好的API,提高代码的可读性和可维护性。虽然Java中没有专门的"readonly"关键字,但可以通过定义公共的读取方法来实现类似的只读访问权限。

0