将 Rust 中的枚举类型转换成 Java

4

我有这段在Rust中声明enum的源代码,但我不理解它。在Java中等价于它的是什么?

pub enum BoxType<'a> {
    BlockNode(&'a StyledNode<'a>),
    InlineNode(&'a StyledNode<'a>),
    AnonymousBlock,
}

其中:BlockNodeInlineNode是类。

编辑Ionuț G. Stan提供的答案范围内,如何使用他提出的代码来实现以下代码的功能。

match self.box_type {
    BlockNode(node) => node,
    InlineNode(node) => node,
    AnonymousBlock => panic!("Anonymous block box has no style node")
}

2
请注意,Java中没有逐行等效的代码。这段代码使用生命周期,这是Java不需要的特性,因为它是一种垃圾回收语言。 - Shepmaster
1
另一个问题实际上是Java中的枚举是枚举(命名常量的集合),而Rust中的枚举实际上是标记联合或者说代数数据类型。虽然标记联合可以轻松表示普通枚举,但反之则不成立。在类似Java的语言中,ADT通常使用类层次结构进行建模。 - Vladimir Matveev
1个回答

6

最接近的等效物不是枚举,而是一个类层次结构和一个访问者(以模仿在Rust中找到的模式匹配部分):

public interface BoxType {
  public <R> R accept(BoxTypeVisitor<R> visitor);
}

public class BlockNode implements BoxType {
  public final StyledNode styledNode;

  public BlockNode(StyledNode styledNode) {
    this.styledNode = styledNode;
  }

  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public class InlineNode implements BoxType {
  public final StyledNode styledNode;

  public InlineNode(StyledNode styledNode) {
    this.styledNode = styledNode;
  }

  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public class AnonymousBlock implements BoxType {
  @Override
  public <R> R accept(BoxTypeVisitor<R> visitor) {
    visitor.visit(this);
  }
}

public interface BoxTypeVisitor<R> {
  public R visit(BlockNode box);
  public R visit(InlineNode box);
  public R visit(AnonymousBlock box);
}

正如@Shepmaster在评论中所说,需要注意的是没有与'a部分等价的内容。这是Rust的一个特性,而Java不需要,因为Java始终使用GC。

更新

如何移植模式匹配部分。使用提供的访问器接口:

StyledNode styledNode = boxType.accept(new BoxTypeVisitor<StyledNode> {
  @Override
  public StyledNode visit(BlockNode box) {
    return box.styledNode;
  }

  @Override
  public StyledNode visit(InlineNode box) {
    return box.styledNode;
  }

  @Override
  public StyledNode visit(AnonymousBlock box) {
    throw new RuntimeException("Anonymous block box has no style node");
  }
});

谢谢,我已经更新了问题并添加了一个小需求。你能帮我吗? - Adham
@lonut 太棒了,最后一个问题,如果想在Java中更深入地学习这些概念,我应该学习什么? - Adham
@Adham 对不起,我没有一个单一的资源可以指导你。总的来说,学习函数式编程。这将挑战你当前的信念/技能。你会开始看到新的模式并提炼新的知识。 - Ionuț G. Stan
@lonut,<R> T 的意思是什么? - Adham
1
@Adham 抱歉,应该是 <R> R,它代表访问者累积/产生的结果。 - Ionuț G. Stan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接