JAVA编程规范-初稿

理解并正确使用对象生命周期:
声明变量时尽量缩小作用域:在方法内部声明的局部变量会在方法执行完毕后自动由垃圾回收器回收。避免在类级别声明长期存在的对象引用。

public class MyClass {// 错误做法:全局静态变量可能导致内存泄漏// static List<Object> globalList = new ArrayList<>();public void processData() {// 正确做法:在方法内部创建需要的对象List<Object> dataList = new ArrayList<>();// 使用dataList...}
}

解除无用对象引用:
当不再需要某个对象时,应将其引用设为null,特别是对于集合、监听器和其他回调接口等场景。

public class MyActivity extends Activity {private SomeEventListener listener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listener = new SomeEventListener();someObject.setListener(listener);// 在适当的时候如onDestroy或不再需要监听时解除引用@Overrideprotected void onDestroy() {super.onDestroy();someObject.setListener(null);listener = null; // 防止Activity销毁后仍有外部对象持有其内部匿名类引用导致泄漏}}
}

避免循环引用:
使用WeakReference、SoftReference等弱引用类型替代强引用,允许垃圾回收器回收即使存在引用关系的对象。

class Node {private Object data;private WeakReference<Node> nextNodeRef;public Node(Object data, Node nextNode) {this.data = data;this.nextNodeRef = new WeakReference<>(nextNode);}public void setNextNode(Node nextNode) {this.nextNodeRef = new WeakReference<>(nextNode);}public Node getNextNode() {return nextNodeRef.get();}
}

合理管理线程资源:
关闭不再使用的线程,确保其持有的所有资源能够被释放。
线程池中的工作线程不应当持有Activity或其他组件的直接引用。

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(new Task());// ...// 在任务完成后或者应用关闭时,关闭线程池以释放资源
executor.shutdown();
try {if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {executor.shutdownNow();}
} catch (InterruptedException ie) {executor.shutdownNow();
}

注意系统级资源的清理:
对于文件流、数据库连接、网络套接字等非JVM内存资源,在使用完后要确保调用了对应的关闭或释放方法。

FileInputStream fis = new FileInputStream("file.txt");
try {// 使用fis...
} finally {fis.close(); // 确保在finally块中关闭文件流
}

谨慎使用静态集合类存储对象:
如果静态集合用于存储实例,除非有特殊清理机制,否则其中的对象将无法被垃圾回收

public class Singleton {private static Map<String, HeavyObject> cache = new HashMap<>();public static HeavyObject get(String key) {HeavyObject obj = cache.get(key);if (obj == null) {obj = new HeavyObject();cache.put(key, obj);}// 注意在不再需要时从缓存移除对象,避免长期占用内存// 或者考虑使用有大小限制且有过期策略的缓存实现(如Google Guava的LoadingCache)return obj;}
}

使用适当的数据结构和框架特性:
许多现代Java库和框架提供了对内存管理友好的数据结构和功能,例如Android中的SparseArray代替普通的HashMap可以减少对强引用的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript正则深入

文章目录 一、前言二、高级`API`2.1、模式匹配的用法`(x)`2.2、非捕获括号的模式匹配`(?:x)`2.3、先行断言`x(?=y)`2.4、后行断言`(?<=y)x`2.5、正向否定查找`x(?!y)`2.6、反向否定查找`(?<!y)x`2.7、字符集合和反向字符集合的用法 `[xyz] / [^xyz]`2.8、词边界和非…

在嵌入式设备上使用dropbear实现ssh远程的方法

全程亲测有效 1.下载dropbear源码: https://matt.ucc.asn.au/dropbear/ 2.以 dropbear-2014.63.tar.bz2为例,在服务器/PC上执行如下命令行,注意其中CC和host改为自己目标设备使用的交叉编译工具链 tar xvjf dropbear-2014.63.tar.bz2 cd dropbear-2014.63 ./configu…

数字时代下的内部审计蜕变:探索数字化转型的七大关键领域

写在前面 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应用。广义…

便携式测速仪的工作原理

TH-LS5】便携式测速仪的工作原理主要基于多普勒效应。当测速仪发射电磁波并碰触到物体时&#xff0c;电磁波会被反射回来。如果触碰到的物体有朝向或背向的位移运动&#xff0c;那么测速仪发射与反射回来的电磁波之间会存在一个频率差。这个频率差会被测速仪捕获&#xff0c;并…

记录一下SpringBoot电子邮件发送这件事

起因&#xff1a; 这次想做一个以电子邮件的方式来发送验证码给管理员&#xff0c;以便修改管理员密码。由于自己将本地环境部署的电子邮件案例测试通过后&#xff0c;便天真地以为能够上线&#xff0c;正常跑通了&#xff0c;但是由于是第一次接触这个电子邮箱&#xff0c;对其…

简单多状态dp问题----按摩师

面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 1、状态表示&#xff1a; dp[i]&#xff1a;从前i个顾客预约中&#xff0c;接收预约的最大总时长。 2、状态转移方程&#xff1a; 首先本题特别的地方在于&#xff1a;不能连续接收两个预约&#xff0c;即不能…

【绘图案例-复习昨天的内容 Objective-C语言】

一、先把这个昨天的内容复习一下 1.首先,昨天学了QQ案例, 然后呢,把这个“通讯录”做完了啊, 在这个里边儿, 通讯录里边儿,有这么几个: 1)开关处理的逻辑:打开“自动登录”,让“记住密码”也自动去打开,取消“记住密码”,“自动登录”也自动去关闭, 2)然后呢,…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的SDI接收HLS多路视频融合叠加应用本方案的SDI接收GTX…

MySQL Server架构概述

推荐&#xff1a;SQL语句执行顺序相关问题。 MySQL Server架构 分层概述 MySQL Server架构可抽象为3层。 连接层&#xff1a;验证用户名密码&#xff0c;认证成功后&#xff0c;获取当前账号的权限并缓存&#xff0c;并分配TCP连接池和线程池资源。处理层&#xff1a;实现核…

代码随想录算法训练营第三十七天|LeetCode738 单调递增的数字、LeetCode968 监控二叉树

738.单调递增的数字 思路&#xff1a;要求一个数字从第一位往后的大小是单调递增的&#xff0c;先把数字转换成字符串&#xff0c;然后从后往前逐位遍历&#xff0c;如果当前位比前一位小&#xff0c;则前一位--&#xff0c;从当前位往后都应该为9&#xff0c;因此记下当前位置…

VPN应用场景典型案例-匿名网关组网应用

​​​​​​组网需求 多个发起方使用动态接入互联网方式,如PPPoE拨号或者NAT转换,这种方式中,发起方每次使用的IP地址可能不一致,所以响应端无法使用指定对端IP地址方式,匿名网关一端不指定对端IP,通过ID识别对端身份建立IPSec隧道,实现公司间内部网络的安全通信。 典…

去电脑维修店修电脑需要注意什么呢?装机之家晓龙

每当电脑出现故障时&#xff0c;你无疑会感到非常沮丧。 如果计算机已过了保修期&#xff0c;您将无法享受制造商的免费保修服务。 这意味着您必须自费找到一家电脑维修店。 去电脑维修店并不容易。 大家一定要知道&#xff0c;电脑维修非常困难&#xff0c;尤其是笔记本电脑维…

美国站群服务器租用需要考虑哪些关键点

美国站群服务器租用通常指的是租用位于美国数据中心的服务器&#xff0c;这些服务器具备多个IP地址&#xff0c;适合用于建立和管理多个网站(即站群)。那么美国站群服务器租用需要考虑哪些关键点&#xff0c;RAKsmart小编为您整理发布美国站群服务器租用需要考虑哪些关键点。 在…

基于rk3568解决gpio阶梯波形(适用于i2c、uart、电平转换)

目录 1、理解GPIO的开漏&#xff08;OD&#xff09;和开集&#xff08;OC&#xff09; 2、查询io寄存器地址及定义 3、配置可调寄存器接口dev/mem author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye_嵌入式,Linux,Qt-CSDN博客daisy.skye擅长嵌入式,Linux,Q…

gorm快速上手

简介 1.什么是orm ORM全称是:Object Relational Mapping(对象关系映射)&#xff0c;其主要作用是在编程中&#xff0c;把面向对象的概念跟数据库中表的概念对应起来。举例来说就是&#xff0c;我定义一个对象&#xff0c;那就对应着一张表&#xff0c;这个对象的实例&#xf…

广播

1.什么是广播 2.标准广播 BroadStandardActivity.java package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View;…

1688商品采集API轻松实现商品上传上货搬家

item_get-获得1688商品详情 公共参数 请求地址: 1688/item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,…

安卓 Kotlin 面试题 21-30

&#x1f525; 21、 Kotlin 中的“open”和“public”有什么区别&#xff1f;&#x1f525; open 关键字的意思是“为扩展而开放” 。 类上的 open 注释与 Java 的相反 final&#xff1a;它允许其他人从该类继承。 如果您不指定任何可见性修饰符&#xff0c;则默认使用public&…

Qt 范例阅读 :插件功能 plugabdpaint

一、源码目录&#xff1a; Qt\Examples\Qt-5.12.4\widgets\tools\plugandpaint 二、定义接口 class FilterInterface { public:virtual ~FilterInterface() {}virtual QStringList filters() const 0;virtual QImage filterImage(const QString &filter, const QImage &…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展&#xff0c;并搜索remote ssh 它大概长这样&#xff0c;点击安装 安装成功后&#xff0c;在左侧栏会出现远程连接的图标&#xff0c;点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…