java - 关于对象创建的基本事情 :is it a good practice to create a new object of listener, 每次我们想为一个 View 设置一个监听器

标签 java android

好吧,我正在努力优化我的应用程序,我想每次我们设置一个监听器时,通常我们都是这样做的

fadeOut.setAnimationListener(new AnimationListener() {
                            @Override
                            public void onAnimationEnd(Animation animation) {
                            }
                            @Override
                            public void onAnimationRepeat(Animation animation) {
                                }
                            @Override
                            public void onAnimationStart(Animation animation) {
                            }
                        });

这样,我们是否每次都通过不提供变量名来创建一个新对象?我的意思是假设我想为 fadeOut 设置两次监听器,这不会占用两个监听器的两倍空间已经创建了?难道我不应该创建一个变量吗?并在需要时继续重写它?

fadeOut.setAnimationListener(null) 会清除所有已创建的变量吗? 这种常见做法是否占用的内存太少以至于可以忽略?

最佳答案

好吧,内存不是这里唯一的问题。当然,它占用的内存是单个监听器的两倍,但最重要的是,您将失去获得更清晰、更有意义的完整代码的能力。这是一个更好的选择:

//as a field
FadeAnimationListener fadeAnimationListener = new FadeAnimationListener();

//inside a method
fadeOut.setAnimationListener(fadeAnimationListener);

//as a static or not inner class or a public high level class
private static class FadeAnimationListener implements AnimationListener {
    @Override
    public void onAnimationEnd(Animation animation) {
        //do your specific stuff here
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        //do your specific stuff here
    }

    @Override
    public void onAnimationStart(Animation animation) {
        //do your specific stuff here
    }
 }

请注意,在 Eclipse 中,您可以按 CTRL+1(mac : command + 1),快速修复菜单将为您提供从匿名内部类创建适当内部类的方法。所以基本上,这种更简洁的方法不需要击键/没有任何代价。


关于调用 setListener(null),这通常不是必需的,因为从组件到它的监听器的所有东西都会一起被垃圾收集(当 Activity 结束时),并且监听器的成本不足以真正关心它.

此外,请仔细阅读这种情况下方法的 javadoc,它们可能并不都允许空监听器并做出正确 react ,尽管它们通常会这样做,但这不是“定义明确的标准”。

关于java - 关于对象创建的基本事情 :is it a good practice to create a new object of listener, 每次我们想为一个 View 设置一个监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036432/

相关文章:

android - 减少 Android 中的 UI 自动化测试时间

java - 单元测试之间数据库未删除

java - 收集器与结果类型中的通配符不匹配

JavaEE : Question about design

java - 第一个正则表达式实例匹配不匹配第一行?

java - 当我的闹钟触发 onReceive() 时,通知未显示

android - 在小部件中添加微调器

android - 如何禁用 bugsense android?

java - 如何每 15 分钟重复一次操作

java - 为什么我的 JAVA GUI 打开多个窗口?