C#迁移Java时类构造函数:this()语法含义及对应Java实现方法
C# 构造函数
:this()语法说明及Java迁移方案 语法含义确认
你观察到的逻辑完全正确:C#中构造函数声明后跟随的:this(参数列表)就是调用当前类中参数匹配的其他构造函数。此处第二个FacTextBlock构造的入参正好匹配第一个三参数构造的签名,因此实例化时会先执行三参数构造的全部逻辑,再执行当前构造大括号内的自定义代码。
该语法是C#提供的「构造函数链」能力,作用是复用同类其他构造的逻辑,避免重复代码。
Java对应实现方式
Java原生支持同类构造调用的能力,语法和调用父类构造的super()高度一致,直接使用this(参数列表)即可,**唯一强制要求是this()语句必须放在当前构造函数的第一行**,和super()`的位置规则完全一致。
转换后的示例代码如下:
public class FacTextBlock extends Block { private String _Text; private FacFont _Font; private FacDocument __Document; private boolean _IsVirtual; // 对应原C#第一个构造函数 public FacTextBlock(FacRegion region, String text, FacFont font) { // 对应原C#的:base(...),super必须放第一行 super(region, new FacBlock[0]); int cleanCount = 0; for (int i = text.length() - 1; i > -1; i--) { // 8232对应Unicode行分隔符 if (text.charAt(i) == 8232) { cleanCount++; } else { break; } } if (cleanCount != 0) { text = text.substring(0, text.length() - cleanCount); } // 过滤[]字符 StringBuilder filtered = new StringBuilder(); for (char c : text.toCharArray()) { if (c != '[' && c != ']') { filtered.append(c); } } text = filtered.toString(); this._Text = text; this._Font = font; } // 对应原C#第二个构造函数 public FacTextBlock(FacTextBlock[] textBlocks) { // 对应原C#的:this(...),必须放第一行 this(FacBlock.getRegion(textBlocks), FacTextBlock._GetMergedText(textBlocks), textBlocks[0].getFont()); FacDocument document = textBlocks[0].getDocument(); if (document != null) { this.__Document = document; } this._IsVirtual = true; } // 此处省略其他getter、setter及静态方法实现 }
注:以上代码仅为核心逻辑对应实现,实际迁移时可根据项目的编码规范调整成员变量访问方式、方法命名风格等细节。
内容的提问来源于stack exchange,提问作者Louay Gourrida
相关产品推荐
相关产品推荐

