Effective Java笔记(15)使类和成员的可访问性最小化

Java高效编程(15):最小化类与成员的可见性 在软件设计中,信息隐藏和封装是关键原则。通过尽可能减少类与成员的可见性,我们可以提高代码的安全性、可维护性和可重用性,降低组件之间的耦合度,从而减少系统开发和维护的风险。 阅读详情

        区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其 内 部数据和其他实现细节 。 设计良好的组件会隐藏所有的实现细节, 把 API 与实现清晰地隔离开来 。 然后,组件之间只通过 AP I 进行通信,一个模块不需要知道其他模块 的内部工作情况 。 这个概念被称为信息隐藏或封装,是软件设计的基本原则之一。

        信息隐藏之所以非常重要有许多原因,其中大多是因为 : 它可以有效地解除组成系统的各组件之间的藕合关系,即解耦,使得这些组件可以独立地开发、 测试、优化 、使用、理解和修改 。 因为这些组件可以并行开发,所以加快了系统开发的速度 。 同时减轻了维护的负担,程序员可以更快地理解这些组件,并且在调试它们的时候不影响其他的组件 。

        Java 提供了许多机制( facility )来协助信息隐藏 。 访问控制( access control )机制决定了类、接口和成员的可访问性( accessibility ) 。 实体的可访问性是由该实体声明所在的位置,以及该实体声明中所出现的访问修饰符( private 、protected 和 public)共同决定的 。 正确地使用这些修饰符对于实现信息隐藏是非常关键的 。

        规则很简单 :尽可能地使每个类或者成员不被外界访问 。 换句话说,应该使用与你正在编写的软件的对应功能相一致的 、 尽可能最小的访问级别 。

        如果一个包级私有的顶层类(或者接口) 只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个类的私有嵌套类 。 这样可以将它的可访问范围从包中的所有类缩小到使用它的那个类 。 然而,降低不必要公有类的可访问性,比降低包级私有的顶层类的可访问性重要得多:因为公有类是包的 API 的一部分,而包级私有的顶层类则已经是这个包的实现的一部分 。

        对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:

  • 私有的( private )——只有在声明该成员的顶层类内部才可以访问这个成员 。
  • 包级私有的( package-private ) 一一声明该成员的包内部的任何类都可以访问这个成员 。 从技术上讲,它被称为“缺省”( default )访问级别,如果没有为成员指定访问修饰符,就采用这个访问级别(当然,接口成员除外,它们默认的访问级别是公有的) 。
  • 受保护的( protected ) 一一声明该成员的类的子类可以访问这个成员(但有一些限制),并且声明该成员的包内部的任何类也可以访问这个成员 。
  • 公有的( public ) ——在任何地方都可以访问该成员 。

        有一条规则限制了降低方法的可访问性的能力 。 如果方法覆盖了超类中的 一个方法,子类中的访问级别就不允许低于超类中的访问级别。 这样可以确保任何可使用超类的实例的地方也都可以使用子类的实例(里氏替换原则) 。 如果违反了这条规则,那么当你试图编译该子类的时候,编译器就会产生一条错误消息 。 这条规则有一个特例:如果一个类实现了一个接口,那么接口中所有的方法在这个类中也都必须被声明为公有的 。

        公有类的实例域决不能是公有的。 如果实例域是非 final 的,或者是一个指向可变对象的 final 引用, 那么一旦使这个域成为公有的,就等于放弃了对存储在这个域中的值进行限制的能力;这意味着,你也放弃了强制这个域不可变的能力 。 同时,当这个域被修改的时候,你也失去了对它采取任何行动的能力 。因此, 包含公有可变域的类通常并不是线程安全的 。 即使域是 final 的,并且引用不可变的对象,但当把这个域变成公有的时候,也就放弃了“切换到一种新的内部数据表示法”的灵活性 。

        注意,长度非零的数组总是可变的,所以让类具有公有的静态 final 数组域,或者返回这种域的访问方法,这是错误的 。 如果类具有这样的域或者访问方法,客户端将能够修改数组中的内容。 这是安全漏洞的一个常见根源:

public static final Thing[] VALUES = { . . . };

        要注意 ,许多 IDE 产生的访问方法会返回指向私有数组域的引用 ,正好导致了这个问题 。 修正这个问题有两种方法 。 可以使公有数组变成私有的,并增加一个公有的不可变列表:

private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES=
    Collections.unmodifiablelist(Arrays.aslist(PRIVATE_VALUES));

        另一种方法是,也可以使数组变成私有的,并添加一个公有方法,它返回私有数组的一个拷贝:

private static final Thing[] PRIVATE.VALUES = { ... };
public static final Thing[] values() {
    return PRIVATE_ VALUES.clone();
}

        总而言之,应该始终尽可能(合理)地降低程序元素的可访问性 。 在仔细地设计了一个最小的公有 API 之后,应该防止把任何散乱的类、接口或者成员变成 API 的一部分 。 除了公有静态 final 域的特殊情形之外(此时它们充当常量 ),公有类都不应该包含公有域,并且要确保公有静态 final 域所引用的对象都是不可变的 。

信息学奥赛一本通高手训练1680:序列 题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p 阅读详情

相关推荐

解密微信视频号推荐算法的三大核心机制

本文深入解析微信视频号推荐算法的三大核心机制:用户行为数据、视频内容质量和社交关系链。通过详细的数据分析和实战测试,揭示算法如何根据完播率、互动深度、原创性检测和社交关系等因素决定内容推荐。帮助用户和创作者更好地理解并利用视频号算法,提升内容曝光和观看体验。

weixin_42573113的博客 1786

《Effective Java》第15条:使类和成员的可访问性最小化

原文P61:公有类的实例域决不能是公有的。从上面的表格可以看出,类中的某个成员从 default 修饰符变为 protected 后,就突破了“包”的限制,可以在其他包中被使用,这个时候,该成员就变成了类的导出的API的一部分,应该永远得到支持。受保护的成员是类的导出的API的一部分,必须永远得到支持。也就是说,子类在覆盖超类方法的时候,该方法的访问级别不允许低于超类中的访问级别,同样的,如果实现一个接口,因为接口中的方法默认都是public的,所以子类中该接口的所有方法也必须都是public的。

TD_FAlmK的博客 1058

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

带你快速看完9.8分神作《Effective Java》—— 类和接口篇

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2022年1月7日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 15 使类和成员的可访问性最小化 面向对象语言设计时的两大“法宝”就是封装和解耦。其中,封装可以隐藏组件所有的实现细节,把API与实现清晰隔离开,因此也就解除组成系

如切如磋,如琢如磨 1957

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 288

科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化

本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。

weixin_42524708的博客 1131

Effective Java---15 使类和成员的可访问性最小化

前言 我自己在平时的编程中其实并未太多思考类和成员的访问性,要么是private,或者就是public直接用起来,大家都知道Java中有四种访问级别,从小到大依次是private(类内可访问)、protected(同包下及子类可访问)、default(同包下类可访问,子类不能)、public(All),那我们为什么需要不同的访问修饰符呢? 信息隐藏 区分设计良好的组件与设计不佳的组件的最重要的依据是,它们关于隐藏内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地将它的 API 与

weixin_44212383的博客 299

Qt QCustomPlot 图形库详解及使用

QCustomPlot 是一个开源的 Qt C++ 库,专门用于创建数据图表。易于集成到 Qt 项目中。支持多种图表类型,如折线图、散点图、条形图等。提供丰富的交互功能,如缩放、平移、选择和拖动。高度可定制,支持图形的各种样式设置。// 添加第一条曲线i < 101;++i) {// 设置曲线颜色// 添加第二条曲线i < 101;++i) {// 设置曲线颜色// 设置散点样式// 添加图例。

MusicScore的博客 764

《Effective Java》解读第15条:使类和成员的可访问性最小化

本文阐述了软件设计中"使类和成员可访问性最小化"的核心原则。建议从最严格的private访问级别开始,仅在必要时逐步放宽至package-private、protected或public。重点包括:1)顶层类应优先设为包级私有;2)实例字段决不应设为public;3)公有静态final常量需确保不可变性;4)Java9模块系统提供额外保护。这种最小化访问控制的做法能有效实现信息隐藏,带来解耦、可维护性提升、性能优化和并行开发等优势。通过严格封装内部实现细节,仅暴露必要API,可以构建更健

Cosmoshhhyyy的博客 411

【软件使用】向日葵网络连接错误

一直报这个错误,尝试了修改版本无果,各种密码都正确,最后得出结轮是时间没有同步,查看代理是否更改了时间,做一下同步即可。

andeyeluguo的博客 7973

【Unity实战100例】Unity循环UI界面切换卡片功能

功能包括:可以设置半径,高度,速度,元素数量用户可以根据自己的实际需求接入 制作思路:创建每个元素对应的虚拟点,通过旋转管理这些虚拟点,然后把旋转信息和位置信息同步给实际的元素

纯技术流日常开发商业开发记录总结等 7717

Effective Java 【类和接口】第15条 使类的成员的可访问行最小化

目录前言java中如何控制对于顶层的(非嵌套的)类和接口对于成员(域、方法、嵌套类和嵌套接口)如何确定成员应该用什么修饰符?总结 前言 区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。设计良好的组件会隐藏所有的实现细节,把API与实现清晰地隔离开来。这种概念被称为信息隐藏或者封装,是软件设计地基本原则之一。 信息隐藏之所以非常重要有许多原因,其中大多是因为:**它可以有效地解除组成系统地各组件之间地耦合关系,即解耦,使得这些组件可以独立地开发、测试

zhangxiaoxiao9527的博客 312

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

《Effective Java》类和接口

第15条:使类和成员的可访问性最小化 参考学习:effective java(13) 之使类和成员的可访问性最小化 第16条:要在公有类而非公有域中使用访问方法 参考学习:effective java(14) 之在公有类中使用访问方法而非公有域 第17条:使可变性最小化 参考学习:effective java(15) 之使可变性最小化 第18条:复合优先于继承 参考学习:effective java(16) 之复合优先于继承 第19条:要么设计继承并提供文档说明,要么禁止继承 参考学习:effective

朱嫑膘的博客 253

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Effective Java 第三版读书笔记(类和接口)

第15条.使类和成员的可访问性最小化 对于成员有四种可访问级别: 1.私有的(private)----- 只有在声明该成员的顶层类内部才可以访问这个成员。 2.包级私有的(package-private)----- 声明该成员的包内部的任何类都可以访问这个成员,也是默认访问级别,接口成员除外,接口成员默认的访问级别是公有的。 3.受保护的(protected)----- 声明该成员的类...

qq_27707957的博客 340

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【读书笔记】Effective Java(类和接口)

读书笔记-Effective Java(类和接口)

我的博客 392

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《Effective Java》学习笔记15--25

本栏是博主根据如题教材进行Java进阶时所记的笔记,包括对原著的概括、理解,教材代码的报错和运行情况。十分建议看过原著遇到费解地方再来参考或与博主讨论。致敬作者Joshua Bloch和各路翻译者们,以及为我提供可参考博文的博主们。 复制粘贴改格式好累,这几篇全都给出git地址,大家自己download下来看好了。或者想直接在浏览器上看可以考虑用这个名叫OctoTree的插件。安装教程网上大把,...

欢迎访问 花落的速度 的博客 322

Effective Java:类和接口的设计

Efftive Java 类 接口 interface class 设计

qq_35066345的博客 271

《Effective Java》第4章 类和接口

类和接口是Java程序设计语言的核心,那么类和接口的设计上必然会有一些大师的指导性原则,能够指导我们设计出有用,健壮和灵活的类和接口。

AnnaLoad的专栏 674

《Effective Java Third》第四章总结:类和接口

https://blog.youkuaiyun.com/liyagangcsdn/article/details/68946795 https://www.cnblogs.com/bushi/articles/6525044.html https://blog.youkuaiyun.com/weixin_34236869/article/details/85811863 https://blog.youkuaiyun.com/zjq...

376

[Java读书笔记] Effective Java(Third Edition) 第 4 章 类和接口

第 15 条: 使类和成员的可访问性最小化 软件设计基本原则:信息隐藏和封装。 信息隐藏可以有效解耦,使组件可以独立地开发、测试、优化、使用和修改。 经验法则:尽可能地使每个类或者成员不被外界访问。 对于成员(属性、方法、嵌套类和嵌套接口),有四种可能的访问级别,在这里,按照可访问性从小到大列出: private —— 该成员只能在声明它的顶层类内访问。 ...

weixin_30702887的博客 221

Effective java笔记(三),类与接口

类与接口是Java语言的核心,设计出更加有用、健壮和灵活的类与接口很重要。 13、使类和成员的可访问性最小化 设计良好的模块会隐藏起所有的实现细节,仅使用API与其他模块进行通信。这个概念称为信息隐藏或封装,是软件设计的基本原则之一。信息隐藏可以是实现系统各模块的解耦,以使这些模块可以独立的开发、测试、优化。信息隐藏还提高了软件的可重用性,降低了构建大型系统的风险。 java中实体的可访...

dianbinzi0928的博客 264

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule15~Rule19

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule15~Rule19 本文主要介绍了类和接口相关的内容

weixin_44453385的博客 713

Effective-java-读书笔记之类和接口

类和接口的讲解

constant_rain的博客 383

Effective Java读书笔记——第四章 类和接口

第13条:使类和成员的可访问性最小化 略。。。 第14条:在共有类中使用访问方法而非公有域 class Point { public double x; public double y; } 上面的类没有对数据域进行封装,导致这些数据是可以被直接访问的,也就无法进行任何的约束条件。反正,应该对其进行封装: class Point { private

vanpersie_9987的博客 697

Effective Java笔记——第4章类和接口

第13条:使类和成员的可访问性最小化 好处:降低系统模块之间(包之间、类之间)的耦合,使得模块可以独立测试开发,提高可重用性和易维护性 终极目标:尽可能的使每个类或者类的成员不被外接访问。 保护级别和公有的都是类导出的API的一部分,必须永远得到支持,应尽量少用。 注意: 1、包级私有——声明该成员的包内部的任何类都可以访问这个成员,同时,这也是缺省访问级别,如果没有为成

supersnow0622的专栏 402
上一篇: Java 并发编程
下一篇: Effective Java笔记(16)要在公有类而非公有域中使用访问方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值