Trtr:注解编程:修订间差异

来自Hyacinth
使用注解在运行时自动处理字段和方法的控制反转框架
跳转到导航 跳转到搜索
删除的内容 添加的内容
草awa留言 | 贡献
修正错误的量词
草awa留言 | 贡献
无编辑摘要
 
(未显示同一用户的9个中间版本)
第1行: 第1行:
{{标题
'''注解编程''',是指在[[Trtr:Trtr]]的代码中,使用注解替代手动编写过多重复代码的设计模式,本质上是由一个[[IoC]]框架代替完成。
| Trtr注解编程
}}
{{副标题
| 使用注解在运行时自动处理字段和方法的控制反转框架
}}
'''注解编程''',是指在[[Trtr:Trtr/zh]]的代码中,使用注解替代手动编写过多重复代码的设计模式,本质上是由一个[[IoC]]框架代替完成。


= 约束 =
= 约束 =
任何需要被自动处理的字段和方法必须被"[[Trtr:com.github.cao.awa.apricot.anntation.Auto]]"注解,这也包括已经自行初始化的字段。
任何需要被自动处理字段必须被"static"修饰<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/filed/FieldAccessor.java |title=FieldAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/filed/FieldAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>,这也包括已经自行初始化的字段。方法的修饰与正常开发时无异


= 示例 =
= 示例 =
第53行: 第59行:
// 另一种方式声明方块物品
// 另一种方式声明方块物品
// @Auto
// @Auto
// public static Class<TestBlockItem> ITEM = TestBlockItem.class;
// public static final Class<TestBlockItem> ITEM = TestBlockItem.class;


@Auto
@Auto
第63行: 第69行:


= 约定 =
= 约定 =
在使用注解编程时,只有匹配约定字段的名称和类型才会被自动处理。
在使用注解编程时,只有匹配约定字段的名称和类型才会被自动处理,且必须被"[[Trtr:com.github.cao.awa.apricot.anntation.Auto]]"注解


== 字段 ==
== 字段 ==
=== 标识符 ===
=== 标识符 ===
标识符(Identifier)约定名称为"IDENTIFIER"、类型为:[[Minecraft:net.minecraft.util.Identifier]]<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/identifier/IdentifierAccessor.java |title=IdentifierAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-15 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/0c273d23aa961cdc5d031ca6d52fed12ed68867f/src/main/java/com/github/cao/awa/trtr/framework/accessor/identifier/IdentifierAccessor.java |archivedate=2023-03-15 |accessdate=2023-03-16 }}</ref>。
标识符(Identifier)约定名称为"IDENTIFIER"、类型为:[[Minecraft:net.minecraft.util.Identifier]]或[[java.lang.String]]<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/identifier/IdentifierAccessor.java |title=IdentifierAccessor.java at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-06-03 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/040e9e90eccf3f46cc84871bbcabb22e55cfbaf2/src/main/java/com/github/cao/awa/trtr/framework/accessor/identifier/IdentifierAccessor.java |archivedate=2023-06-03 |accessdate=2023-06-11 }}</ref>。


=== 设置(方块) ===
=== 设置(方块) ===
方块设置(Settings)约定名称为"SETTINGS"、备选"SETTING",类型为:[[Minecraft:net.minecraft.block.AbstractBlock.Settings]]的子类<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/setting/BlockSettingAccessor.java |title=BlockSettingAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/0c273d23aa961cdc5d031ca6d52fed12ed68867f/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/setting/BlockSettingAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>,如[[Minecraft:net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting|net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting]]。<ref name="example_block">{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/block/example/ExampleBlock.java |title=ExampleBlock.java at main · cao-awa/the-road-to-reality |publisher=草二号机 |date=2023-03-15 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/40ff64d245df47ca0c8b25db78252ab0cccbc62f/src/main/java/com/github/cao/awa/trtr/block/example/ExampleBlock.java |archivedate=2023-03-15 |accessdate=2023-03-16 }}</ref>
方块设置(Settings)约定名称为"SETTINGS"、备选"SETTING",类型为:[[Minecraft:net.minecraft.block.AbstractBlock.Settings]]的子类<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/setting/BlockSettingAccessor.java |title=BlockSettingAccessor.java at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/0c273d23aa961cdc5d031ca6d52fed12ed68867f/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/setting/BlockSettingAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>,如[[Minecraft:net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting|net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting]]。<ref name="example_block">{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/block/example/ExampleBlock.java |title=ExampleBlock.java at main · sky-ways/the-road-to-reality |publisher=草二号机 |date=2023-03-15 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/40ff64d245df47ca0c8b25db78252ab0cccbc62f/src/main/java/com/github/cao/awa/trtr/block/example/ExampleBlock.java |archivedate=2023-03-15 |accessdate=2023-03-16 }}</ref>


=== 方块物品 ===
=== 方块物品 ===
方块物品(BlockItem)约定名称为"ITEM"、备选"BLOCK_ITEM",类型为:[[Minecraft:net.minecraft.item.BlockItem|net.minecraft.item.BlockItem]]或其子类<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/item/BlockItemAccessor.java |title=BlockItemAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/0c273d23aa961cdc5d031ca6d52fed12ed68867f/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/item/BlockItemAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>。
方块物品(BlockItem)约定名称为"ITEM"、备选"BLOCK_ITEM",类型为:[[Minecraft:net.minecraft.item.BlockItem|net.minecraft.item.BlockItem]]或其子类<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/item/BlockItemAccessor.java |title=BlockItemAccessor.java at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/0c273d23aa961cdc5d031ca6d52fed12ed68867f/src/main/java/com/github/cao/awa/trtr/framework/accessor/block/item/BlockItemAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>。


或者以形如Class<? extends BlockItem>的方式声明类型。<ref name="example_block"></ref>
或者以形如Class<? extends BlockItem>的方式声明类型。<ref name="example_block"></ref>


=== 方块战利品(数据生成) ===
=== 方块战利品(数据生成) ===
方块战利品(Loot)约定名称为"LOOT"、备选"LOOT_PROVIDER",类型为[[Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider]]的子类或[[Trtr:com.github.cao.awa.trtr.framework.data.gen.loot.LootFactory]]的实现<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/loot/LootDataGeneratorAccessor.java |title=LootDataGeneratorAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/loot/LootDataGeneratorAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>,如[[Trtr:com.github.cao.awa.trtr.data.gen.loot.GenericBlockLootProvider]]。
方块战利品(Loot)约定名称为"LOOT"、备选"LOOT_PROVIDER",类型为[[Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider]]的子类或[[Trtr:com.github.cao.awa.trtr.framework.data.gen.loot.LootFactory]]的实现<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/loot/LootDataGeneratorAccessor.java |title=LootDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-03-16 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/loot/LootDataGeneratorAccessor.java |archivedate=2023-03-16 |accessdate=2023-03-16 }}</ref>,如[[Trtr:com.github.cao.awa.trtr.data.gen.loot.GenericBlockLootProvider]]。


或者以形如Class<? extends SimpleFabricLootTableProvider>或LootFactory<? extends SimpleFabricLootTableProvider>的方式声明类型。<ref name="example_block"></ref>
或者以形如Class<? extends SimpleFabricLootTableProvider>或LootFactory<? extends SimpleFabricLootTableProvider>的方式声明类型。<ref name="example_block"></ref>


=== 方块模型(数据生成) ===
=== 方块模型(数据生成) ===
方块模型(models)约定名称为"MODEL"、备选"MODEL_PROVIDER",类型为[[Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider]]的子类<ref>{{cite web |url=https://github.com/cao-awa/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/model/ModelDataGeneratorAccessor.java |title=ModelDataGeneratorAccessor.java at main · cao-awa/the-road-to-reality |publisher=草awa |date=2023-03-15 |archiveurl=https://github.com/cao-awa/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/model/ModelDataGeneratorAccessor.java |archivedate=2023-03-15 |accessdate=2023-03-16 }}</ref>,如[[Trtr:com.github.cao.awa.trtr.data.gen.model.GenericBlockModelProvider]]。
方块模型(models)约定名称为"MODEL"、备选"MODEL_PROVIDER",类型为[[Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider]]的子类<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/model/ModelDataGeneratorAccessor.java |title=ModelDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-03-15 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/4cffec2d6a283a8d4421dcd2d93faff805d2817b/src/main/java/com/github/cao/awa/trtr/framework/accessor/data/gen/model/ModelDataGeneratorAccessor.java |archivedate=2023-03-15 |accessdate=2023-03-16 }}</ref>,如[[Trtr:com.github.cao.awa.trtr.data.gen.model.GenericBlockModelProvider]]。


或者以形如Class<? extends BlockItem>的方式声明类型。<ref name="example_block"></ref>
或者以形如Class<? extends BlockItem>的方式声明类型。<ref name="example_block"></ref>

=== 方块属性 ===
方块属性(properties)没有约定名称,只需要添加[[Trtr:com.github.cao.awa.trtr.annotation.property.AutoProperty]]即可被自动添加,类型为[[Minecraft:net.minecraft.state.property.Property]]子类<ref>{{cite web |url=https://github.com/sky-ways/the-road-to-reality/blob/main/src/main/java/com/github/cao/awa/trtr/framework/block/BlockFramework.java#L245 |title=BlockFramework.java#L245 at main · sky-ways/the-road-to-reality |publisher=草awa |date=2023-06-04 |archiveurl=https://github.com/sky-ways/the-road-to-reality/blob/27190e7d17f57d0cfb9d9a4577404e086824ef72/src/main/java/com/github/cao/awa/trtr/framework/block/BlockFramework.java#L245 |archivedate=2023-06-04 |accessdate=2023-06-14 }}</ref>。


== 方法 ==
== 方法 ==
第91行: 第100行:
== 注解 ==
== 注解 ==
=== 自动处理 ===
=== 自动处理 ===
要让框架自动处理一个类,需要在类上添加[[Trtr:com.github.cao.awa.apricot.annotations.Auto|@Auto]]注解,照标准样式,其他任何需要字段处理的字段和方法也应加上此注解。
要让框架自动处理一个类,需要在类上添加@Auto注解,照标准样式,其他任何需要自动处理的字段和方法也应加上此注解(包括构造器)


=== 要求工具挖掘 ===
=== 要求工具挖掘 ===
第112行: 第121行:


= 样式 =
= 样式 =
在代码中,@Auto注解虽然被标准要求在每一个会被自动处理的字段、方法和类上出现,以统一标准样式。但这一要求不是强制性的,只需要至少在类上添加注解即可使用注解编程
在代码中,@Auto注解依照标准要求在每一个会被自动处理的字段、方法和类上出现,以统一标准样式。没有@Auto注解的字段将不会被处理


标准样式是在向主仓库创建拉取请求或用任意其他方式提交代码时所必须的,非规范样式的代码会被拒绝合并。
标准样式是在向主仓库创建拉取请求或用任意其他方式提交代码时所必须的,非规范样式的代码会被拒绝合并。


= 参考 =
= 参考 =

2023年6月14日 (三) 18:36的最新版本


注解编程,是指在Trtr-Minecraft项目的代码中,使用注解替代手动编写过多重复代码的设计模式,本质上是由一个IoC框架代替完成。

约束

任何需要被自动处理的字段和方法必须被"Trtr:com.github.cao.awa.apricot.anntation.Auto"注解,这也包括已经自行初始化的字段。

示例

在任意位置(合理的软件包下)编写如下代码,而后直接运行Minecraft,此时不需要自行去注册这个方块,Trtr:方块反射框架会处理好这一切。

以下字段"IDENTIFIER"和"SETTINGS"必须存在,必须大写。

@Auto
public class TestBlock extends TrtrBlock {
    @Auto
    public static final Identifier IDENTIFIER = Identifier.of("trtr", "test");
    @Auto
    public static final Settings SETTINGS = FabricBlockSettings.of(Material.STONE, MapColor.GRAY);

    @Auto
    public TestBlock(Settings settings) {
        super(settings);
    }
}

任何被支持的字段都可以以类似以上的方式被自动处理,而开发者只需要写更少量的重复代码。

自动初始化

Trtr的IoC框架支持自动初始化字段,例如此处有一方块物品:

@Auto
public class TestBlockItem extends TrtrBlockItem {
    @Auto
    public static final FabricItemSettings SETTINGS = new FabricItemSettings();

    @Auto
    public AluniteOreItem(Block block, Settings settings) {
        super(block, settings);
    }
}

这时候可以直接在TestBlock中加入字段"ITEM"或"BLOCK_ITEM",而不需要任何的赋值。如下所示:

@Auto
public class TestBlock extends TrtrBlock {
    @Auto
    public static final Identifier IDENTIFIER = Identifier.of("trtr", "test");
    @Auto
    public static final Settings SETTINGS = FabricBlockSettings.of(Material.STONE, MapColor.GRAY);
    @Auto
    public static TestBlockItem ITEM;
//  另一种方式声明方块物品
//  @Auto
//  public static final Class<TestBlockItem> ITEM = TestBlockItem.class;

    @Auto
    public TestBlock(Settings settings) {
        super(settings);
    }
}

约定

在使用注解编程时,只有匹配约定字段的名称和类型才会被自动处理,且必须被"Trtr:com.github.cao.awa.apricot.anntation.Auto"注解。

字段

标识符

标识符(Identifier)约定名称为"IDENTIFIER"、类型为:Minecraft:net.minecraft.util.Identifierjava.lang.String[1]

设置(方块)

方块设置(Settings)约定名称为"SETTINGS"、备选"SETTING",类型为:Minecraft:net.minecraft.block.AbstractBlock.Settings的子类[2],如net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting[3]

方块物品

方块物品(BlockItem)约定名称为"ITEM"、备选"BLOCK_ITEM",类型为:net.minecraft.item.BlockItem或其子类[4]

或者以形如Class<? extends BlockItem>的方式声明类型。[3]

方块战利品(数据生成)

方块战利品(Loot)约定名称为"LOOT"、备选"LOOT_PROVIDER",类型为Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider的子类或Trtr:com.github.cao.awa.trtr.framework.data.gen.loot.LootFactory的实现[5],如Trtr:com.github.cao.awa.trtr.data.gen.loot.GenericBlockLootProvider

或者以形如Class<? extends SimpleFabricLootTableProvider>或LootFactory<? extends SimpleFabricLootTableProvider>的方式声明类型。[3]

方块模型(数据生成)

方块模型(models)约定名称为"MODEL"、备选"MODEL_PROVIDER",类型为Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider的子类[6],如Trtr:com.github.cao.awa.trtr.data.gen.model.GenericBlockModelProvider

或者以形如Class<? extends BlockItem>的方式声明类型。[3]

方块属性

方块属性(properties)没有约定名称,只需要添加Trtr:com.github.cao.awa.trtr.annotation.property.AutoProperty即可被自动添加,类型为Minecraft:net.minecraft.state.property.Property的子类[7]

方法

注解

自动处理

要让框架自动处理一个类,需要在类上添加@Auto注解,照标准样式,其他任何需要自动处理的字段和方法也应加上此注解(包括构造器)。

要求工具挖掘

在目标类上添加如下注解以让框架自动处理挖掘时需要的工具种类和级别:

斧:@AxeMining(MiningLevels.DIAMOND)

锄:@HoeMining(MiningLevels.DIAMOND)

镐:@PickaxeMining(MiningLevels.DIAMOND)

剪刀:@ShearsMining(MiningLevels.DIAMOND)

铲:@ShovelMining(MiningLevels.DIAMOND)

剑:@SwordMining(MiningLevels.DIAMOND)

数据生成

数据生成并未要求添加任何注解,使用@DataGen注解标记一个字段或类是用于数据生成的,用于降低代码阅读难度。

样式

在代码中,@Auto注解依照标准要求在每一个会被自动处理的字段、方法和类上出现,以统一标准样式。没有@Auto注解的字段将不会被处理。

标准样式是在向主仓库创建拉取请求或用任意其他方式提交代码时所必须的,非规范样式的代码会被拒绝合并。

参考

  1. "IdentifierAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-06-03. Archived from the original on 2023-06-03. Retrieved 2023-06-11.
  2. "BlockSettingAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  3. 3.0 3.1 3.2 3.3 "ExampleBlock.java at main · sky-ways/the-road-to-reality". 草二号机. 2023-03-15. Archived from the original on 2023-03-15. Retrieved 2023-03-16.
  4. "BlockItemAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  5. "LootDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  6. "ModelDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-15. Archived from the original on 2023-03-15. Retrieved 2023-03-16.
  7. "BlockFramework.java#L245 at main · sky-ways/the-road-to-reality". 草awa. 2023-06-04. Archived from the original on 2023-06-04. Retrieved 2023-06-14.