java - 使用一系列 lambda 函数来定义类功能是否合适?

标签 java oop lambda java-8 readability

<分区>

在最近的一次讨论中,我和一个 friend 不同意以下使用 lambda 函数来定义类功能。创建具有动态值的对象时,应该使用 lambda 传递动态值,还是使用自定义子类中的覆盖方法提供动态值?

考虑以下示例,其中的目标是拥有一个具有动态文本和图标特征的自定义标签组件。此标签必须具有方法 getText()getIcon()。以下是两个示例:一个使用多个 lambda,另一个定义子类。

Lambda 方法:

class Label {
    private Supplier<String> text;
    private Supplier<Image> icon;

    public Label(Supplier<String> text, Supplier<Image> icon) {
        this.text = text;
        this.icon = icon;
    }

    public String getText() {
        return text.get();
    }

    public Image getIcon() {
        return icon.get();
    }
}

使用:

Label timeLabel = new Label(
    () -> System.currentTimeMillis(),
    () -> CLOCK_IMAGE
);

子类方法:

class Label {
    private String text;
    private Image icon;

    public Label() {
        // some default
    }

    public Label(String text, Image icon) {
        // set fields
    }

    // simple getters
}

使用:

class TimeLabel extends Label {
    public String getText() {
        return System.currentTimeMillis();
    }

    public Image getImage() {
        return CLOCK_IMAGE;
    }
}

Label timeLabel = new TimeLabel();

考虑到内部和外部开发人员的期望、可读性和可用性(包括作为 API 的类),这些方法中哪种更合适?

最佳答案

Lambda 有其用途,但这很可能被过度使用。注意:当你创建一个 lambda 时,你必须建立一个关于你正在使用哪些参数的假设。例如,您无法在外部定义使用 protected 字段的 lambda。

Lambda 也有一些开销,包括 CPU/内存和概念开销。它们是在运行时生成的新类,如果您正在分析或调试它,这些工具只能帮助您理清代码。

关于java - 使用一系列 lambda 函数来定义类功能是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34821669/

相关文章:

java - 我的 Swing 应用程序中的边框布局出了什么问题?

c - C 中的派生类 - 你最喜欢的方法是什么?

c++ - Lambda函数可变捕获从引用到全局变量的行为差异

java - 为什么在我说 new House ("x "时调用父类(super class)构造函数 Building() )?

c++ - 如何存储类型以供以后比较

c# - 获取对作为函数传递的 Lambda 中的参数的引用

java - 如果我们从配置中保护 REST API,是否有必要在 Spring 中使用方法级安全性

java - Spring 如何在运行时从 application.properties 重新加载值

java - Android App 是否有可能不会启动 MainActivity?

vba - VBE 看到模棱两可的名称