gpt4 book ai didi

java - 继承设计模式的不变性

转载 作者:行者123 更新时间:2023-11-30 02:10:11 24 4
gpt4 key购买 nike

我正在遵循 Java 教程,在 Scala 中实现一些代码。

本教程有一段代码,可以最小化为以下内容:

public abstract class A {
private int id;

public A(String name) {
id = Helper.getId(name);
fetchAllAttributes();
}

protected abstract void fetchAllAttributes();

protected int fetchAttribute(String attribute) {
Helper.getAttribute(id, attribute);
}

public class B extends A {
int volume;

public B() {
super("B");
}

@Override
protected void fetchAllAttributes() {
volume = super.fetchAttribute("volume");
}

}
}

这就是将其翻译成 Scala 后的样子:

abstract class A(val name: String) {
private val id = Helper.getId(name)
fetchAllAttributes()

protected def fetchAllAttributes(): Unit

protected def fetchAttribute(attribute: String): Int = {
Helper.getAttribute(id, attribute)
}

class B() extends A("B") {
var volume = 0

override protected def fetchAllAttributes(): Unit = {
volume = super.fetchAttribute("volume")
}
}

}

在这里我想问两个问题:

  1. 这种模式有名称吗?在抽象类的构造函数中调用抽象方法,并为子类提供在其实现中使用的方法?
  2. 作为一名 Scala 开发人员,我真的不喜欢可变对象和变量。有没有一种好方法可以仅使用 val 以不可变的方式实现此目的?

最佳答案

  1. 您可以将其称为反模式。请参阅previous discussions关于从构造函数调用可重写方法的SO。
  2. 当将 java 代码重构为 scala 代码时,一开始对我帮助最大的是了解什么是具有副作用的方法。您不希望类中的方法依赖于可变字段和/或更改它们。 (就像您的 B 类在该卷中一样) 这个小原则有助于保持类免受可变状态的影响。但这并不是一成不变的规则。例如,对于 akka actor,具有可变状态并不罕见。

来自 scala 教程的引用 ( Source ):

Again, this means that a function should not have any side effects. It should take input variables, not modify those variables, then calculate and return something new. Unlike object-oriented programming, you should not change (mutate) the state of other variables, even if those variables are (a) variables of your class or (b) variables that were passed in to your function/method.

关于java - 继承设计模式的不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50357129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com