Java 如何构造公共模块,以便子模块能够从API中获得正确类型的对象?
嘿,所以我有Java 如何构造公共模块,以便子模块能够从API中获得正确类型的对象?,java,gradle,module,structure,Java,Gradle,Module,Structure,嘿,所以我有common模块,其中包含代码显示bellow和另外两个模块bungee和bukkit。我需要如何构造我的代码,以便在每个模块中使用common部分代码,而不必在ChildCommand中将Object转换为CommandSender,是否有办法在那里而不是Object获得正确的CommandSender 一些需要记住的事情: common模块没有依赖项。 蹦极模块使用蹦极绳API和通用模块作为依赖项。 bukkit模块使用bukkit API和common模块作为依赖项。 Bukk
common
模块,其中包含代码显示bellow和另外两个模块bungee
和bukkit
。我需要如何构造我的代码,以便在每个模块中使用common
部分代码,而不必在ChildCommand
中将Object
转换为CommandSender
,是否有办法在那里而不是Object
获得正确的CommandSender
一些需要记住的事情:common
模块没有依赖项。蹦极
模块使用蹦极绳API和通用
模块作为依赖项。bukkit
模块使用bukkit API和common
模块作为依赖项。Bukkit和Bungeecord API都有自己的
CommandSender
类,但它们并不相同。不能修改来自API的类 此类是
通用模块的一部分。
public interface ChildCommand {
void run(Object sender, String[] args);
String getName();
}
public abstract class AbstractCommandService<S> {
protected final Set<ChildCommand> childCommands;
protected AbstractCommandService() {
childCommands = new HashMap<>();
}
public boolean execute(Object sender, String commandName, String[] args) {
for (ChildCommand childCommand : childCommands) {
if (childCommand.getName().equalsIgnoreCase(commandName)) {
childCommand.run(sender, args);
return true;
}
}
return false;
}
public void addCommand(ChildCommand command) {
childCommands.add(command);
}
}
public class BungeeReload implements ChildCommand {
private final String NAME = "reload";
public BungeeReload() {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `net.md_5.bungee.api.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bungee.");
}
}
public class BungeeCommandService extends AbstractCommandService<CommandSender> {}
public class MainBungeeCommand extends Command {
private BungeeCommandService commandService;
public MainBungeeCommand() {
super("cmd-name", "cmd-permission", "cmd-alias");
commandService = new BungeeCommandService();
commandService.addCommand(new BungeeReload());
}
@Override
public void execute(CommandSender sender, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
}
}
}
public class BukkitReload implements ChildCommand {
private final String NAME = "reload";
public BukkitReload () {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `org.bukkit.command.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bukkit.");
}
}
public class BukkitCommandService extends AbstractCommandService<CommandSender> {}
public class MainBukkitCommand implements CommandExecutor {
private BukkitCommandService commandService;
public MainBukkitCommand() {
commandService = new BukkitCommandService();
commandService.addCommand(new BukkitReload());
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
return true;
}
return false;
}
}
此类是bukkit
模块的一部分。
public interface ChildCommand {
void run(Object sender, String[] args);
String getName();
}
public abstract class AbstractCommandService<S> {
protected final Set<ChildCommand> childCommands;
protected AbstractCommandService() {
childCommands = new HashMap<>();
}
public boolean execute(Object sender, String commandName, String[] args) {
for (ChildCommand childCommand : childCommands) {
if (childCommand.getName().equalsIgnoreCase(commandName)) {
childCommand.run(sender, args);
return true;
}
}
return false;
}
public void addCommand(ChildCommand command) {
childCommands.add(command);
}
}
public class BungeeReload implements ChildCommand {
private final String NAME = "reload";
public BungeeReload() {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `net.md_5.bungee.api.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bungee.");
}
}
public class BungeeCommandService extends AbstractCommandService<CommandSender> {}
public class MainBungeeCommand extends Command {
private BungeeCommandService commandService;
public MainBungeeCommand() {
super("cmd-name", "cmd-permission", "cmd-alias");
commandService = new BungeeCommandService();
commandService.addCommand(new BungeeReload());
}
@Override
public void execute(CommandSender sender, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
}
}
}
public class BukkitReload implements ChildCommand {
private final String NAME = "reload";
public BukkitReload () {}
@Override
public String getName() {
return NAME;
}
/*how do I structure my code so here I would get `org.bukkit.command.CommandSender`
instead of `Object` for the sender parameter.*/
@Override
public void run(Object sender, String[] args) {
((CommandSender)sender).sendMessage("Reload command has been ran on bukkit.");
}
}
public class BukkitCommandService extends AbstractCommandService<CommandSender> {}
public class MainBukkitCommand implements CommandExecutor {
private BukkitCommandService commandService;
public MainBukkitCommand() {
commandService = new BukkitCommandService();
commandService.addCommand(new BukkitReload());
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length > 0) {
String commandName = args[0];
boolean successfullyExecuted = commandService.execute(sender, commandName, args);
if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
return true;
}
return false;
}
}
公共类BukkitReload实现ChildCommand{
私有最终字符串NAME=“reload”;
公共BukkitReload(){}
@凌驾
公共字符串getName(){
返回名称;
}
/*我如何构造代码,以便在这里获得'org.bukkit.command.CommandSender'
而不是发送方参数的“Object”*/
@凌驾
公共无效运行(对象发送方,字符串[]args){
((CommandSender)sender.sendMessage(“重新加载命令已在bukkit上运行”);
}
}
公共类BukkitCommandService扩展了AbstractCommandService{}
公共类MainBukkitCommand实现CommandExecutor{
私人BukkitCommandService命令服务;
公共MainBukkitCommand(){
commandService=新的BukkitCommandService();
addCommand(新的BukkitReload());
}
@凌驾
公共布尔onCommand(CommandSender、Command cmd、字符串标签、字符串[]args){
如果(args.length>0){
String commandName=args[0];
布尔值successfullyExecuted=commandService.execute(发送方,commandName,args);
如果(!successfullyExecuted)sender.sendMessage(“未知命令”);
返回true;
}
返回false;
}
}
这里是API中的类。来自BungeeCordAPI的类。
来自BungeeCordAPI的类。
从Bukkit API初始化。
从BukkitAPI中初始化