java latlng_Java里面的封装是不是多此一举?

刚修改了原题目,移除了部分不友善内容,大概可以正经回答了。。。

关于是否多此一举这个问题,我的回答是否定的,但是对于getter和setter这种,我是觉得这一点也不OOP,说到这里可能有些人要反对,别急先听我说完。

先说说为什么需要封装,封装的基本的定义大家都知道,就是隐藏实现,公开接口。要理解封装的意义,那就得先理解公开实现的缺陷——暴露了太多使用者不需要知道的细节,增加心智负担

这一条很好理解,就问你是喜欢看10行的接口定义,还是喜欢看100行的实现。

修改时很容易破坏兼容性

比如某个暴露出来的属性仅仅是内部使用,但是外部使用者也使用了它,那么当他变化时(比如你觉得名字不好,换个名字,或者觉得没用,去掉了这个属性)那么当你更新这个类的时候,使用者那边就要出现问题了。有了接口以后,尽可能保证接口不变,即使真的要移除某个属性(比如变成计算属性),也可以修改相应的访问器来解决。

安全性不足

这里的安全性当然不是指恶意使用者的恶意修改(这种情况下,用private和public根本没用),而是指正常使用下从外部意外的修改了内部状态或者使用了不合法的值的所造成的一系列问题,因为属性没办法监控修改路径,也不能前置检查输入的合法性——想想看,如果有这个需求时,你能想到的方法是不是就是加一个设置函数?

看到这里,你可能还有疑惑,下面就是一个典型问题:OOP的一项基本原则是不要重复你自己(DRY),而这里的封装就是一个严重的重复,难道不是应该在需要的时候才封装吗?

这个问题很好理解,你在编写的过程中,并不知道以后需不需要修改实现,你有预测未来的能力的话当我没说。

说了那么多没有封装的缺点,那么用getter和setter这种访问器的做法就是最佳实践了吗?No

大规模使用getter和setter已经成为了一个Java代码的一个著名特征,而这显著的增加了代码的长度,虽然绝大多数情况下getter和setter都只是做一个简单的转发。

这只能说是Java的抽象层次不够/或者说还不够现代,这一部分是由于历史原因,另一部分是这个问题并没有想象中的严重——因为大多数IDE都有自动生成getter和setter的功能,还有重构的功能,很大程度上掩盖了Java语言设计不够完美的地方。。。

我认为一个足够好的封装语法不应该重复写大量的代码——像C#这种就很不错,以下是官方的例子:

// This class is mutable. Its data can be modified from// outside the class.class Customer

{

// Auto-Impl Properties for trivial get and set public double TotalPurchases { get; set; }

public string Name { get; set; }

public int CustomerID { get; set; }

// Constructor public Customer(double purchases, string name, int ID)

{

TotalPurchases = purchases;

Name = name;

CustomerID = ID;

}

// Methods public string GetContactInfo() {return "ContactInfo";}

public string GetTransactionHistory() {return "History";}

// .. Additional methods, events, etc.}

class Program

{

static void Main()

{

// Intialize a new object. Customer cust1 = new Customer ( 4987.63, "Northwind",90108 );

//Modify a property cust1.TotalPurchases += 499.99;

}

}

这里的get;和set;可以在需要的时候包含代码,对输入数据进行验证

如果Java也设计成这样,那么很多初学者大概就不会对封装这么抵触了(笑)

当然我估计有些人会无脑推荐Kotlin——这没有错,但是对于题主来说先学好Java明显是更为重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值