Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
想法:在Java中嵌入数据/DSL作为注释,并使用APT生成Java代码_Java_Dsl - Fatal编程技术网

想法:在Java中嵌入数据/DSL作为注释,并使用APT生成Java代码

想法:在Java中嵌入数据/DSL作为注释,并使用APT生成Java代码,java,dsl,Java,Dsl,我有一个想法,我想让你来运行它,以获得一些反馈。请看下面的内容,让我知道你的想法,无论是积极的还是消极的 我一直希望有一种方法可以在Java代码中嵌入某些数据片段,而不必一直遵循Java的规则。我最近听过很多关于领域特定语言(DSL)的讨论,如果我们每天都能更多地使用它们,那将是多么美好的事情。我想我知道如何以一种相当优雅的方式做到这一点 以下是我所知道的一些用Java代码(和其他类似C语言)表示的困难的例子,我希望这能解决这些问题: 作为字符串数组的短字符串列表 String[] ar = {

我有一个想法,我想让你来运行它,以获得一些反馈。请看下面的内容,让我知道你的想法,无论是积极的还是消极的

我一直希望有一种方法可以在Java代码中嵌入某些数据片段,而不必一直遵循Java的规则。我最近听过很多关于领域特定语言(DSL)的讨论,如果我们每天都能更多地使用它们,那将是多么美好的事情。我想我知道如何以一种相当优雅的方式做到这一点

以下是我所知道的一些用Java代码(和其他类似C语言)表示的困难的例子,我希望这能解决这些问题:

作为字符串数组的短字符串列表

String[] ar = { "Item1", "Item2", "Item3", "Item4" };
String[] ar = { "The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",  };
@DslTextArray
String[] ar = null; /* Item1, Item2, Item3, Item4 */
@DslMultilineTextArray
String[] ar = null;
/*
The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.
*/
作为字符串数组的长字符串列表

String[] ar = { "Item1", "Item2", "Item3", "Item4" };
String[] ar = { "The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",  };
@DslTextArray
String[] ar = null; /* Item1, Item2, Item3, Item4 */
@DslMultilineTextArray
String[] ar = null;
/*
The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.
*/
作为多维字符串数组的字符串表:

String[][] ar = { { "InvoiceID", "Date", "SubTotal", "Tax", "Total" },
{ "1", "1/2/2009", "300, "21", "321" },
{ "2", "1/4/2008", "100", "7", "107" },
{ "3", "1/6/2008", "200", "14", "214" } };
键值对列表

Map states = new HashMap();
states.add("FL", "Florida");
states.add("OH", "Ohio");
states.add("GA", "Georgia");
states.add("NY", "New York");
states.add("SC", "South Carolina");
@DslMap
Map states = null; /* FL=Florida, OH=Ohio, GA=Georgia, NY=New York, SC=South Carolina */
// Could also put each pair on a new line
HTML代码单个字符串

String html = "<a href=\"www.somesite.com\">Some site</a>";
@DslText
String html = null; /* <a href="www.somesite.com">Some site</a> */
作为字符串数组的长字符串列表

String[] ar = { "Item1", "Item2", "Item3", "Item4" };
String[] ar = { "The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",  };
@DslTextArray
String[] ar = null; /* Item1, Item2, Item3, Item4 */
@DslMultilineTextArray
String[] ar = null;
/*
The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.
*/
作为多维字符串数组或JTable的字符串表:

@DslTextTable
String[][] ar = null;
/*
InvoiceID,Date,SubTotal,Tax,Total
1,1/2/2009,300,21,321
2,1/4/2008,100,7,107
3,1/6/2008,200,14,214
*/
键值对列表

Map states = new HashMap();
states.add("FL", "Florida");
states.add("OH", "Ohio");
states.add("GA", "Georgia");
states.add("NY", "New York");
states.add("SC", "South Carolina");
@DslMap
Map states = null; /* FL=Florida, OH=Ohio, GA=Georgia, NY=New York, SC=South Carolina */
// Could also put each pair on a new line
HTML代码单个字符串

String html = "<a href=\"www.somesite.com\">Some site</a>";
@DslText
String html = null; /* <a href="www.somesite.com">Some site</a> */
我可以想到此解决方案的一些要求/功能:

必须声明变量以保存脚本将在Java源代码中生成的数据。这允许源代码的其余部分了解结果数据,即使编译器不知道数据来自何处

  • 不得违反Java语言,以便IDE和javac不会显示错误
  • 使用现有的所有Java代码。无需替换任何现有代码。只要在你喜欢的地方添加这些代码片段
  • 必须易于使用其他类型进行扩展
  • 以后必须能够对IDE进行扩展,以允许源代码突出显示和自动完成
  • 翻译发生在编译时,因此必须生成有效的Java代码
  • 将列表、多行文本块(如CSS、SQL)转换为字符串和字符串[]
  • 转换和编码XML、HTML
  • 重写代码时,请保留相同的行号。不要添加任何行,这样调试和读取错误就不会成为一件痛苦的事情
  • 在运行时运行用任何BSF语言编写的代码。允许它将任何参数传递给脚本,并将任何Java类或原语返回给Java
  • 在编译时运行用任何BSF语言编写的代码以生成Java源代码。类似于M4在Linux上的使用方式
  • 稍后:允许您将多次调用的字符串结果链接在一起,以构建一个长字符串。有些可能是编译时的,有些则是运行时的

再一次,如果能得到一些反馈,我将不胜感激。这是一个愚蠢的想法吗?外面已经有这样的东西了吗?你会费心用这样的东西吗?还是我应该把它留给自己?

这肯定是可行的,但我必须说我不太喜欢它

它使数据结构的初始化更加容易

但是

  • 我很少需要用编译时常量初始化这样的数据结构。因此,类/java文件旁边的单独文件更有用

  • 对于开发人员来说,这一点都不透明。没有人希望注释转换成数据。事实上,如果A遇到这样的评论,我可能会认为它注释旧代码并立即删除

  • ATP是一个功能强大且有趣的工具,但缺少IDE集成。因此,您必须始终使用ANT构建和运行您的应用程序,而ANT没有hitten F11或IDE为此提供的任何快捷方式那么好和快

因此,基本上,您在开发基础架构复杂性方面受到了巨大的冲击,而在键入速度方面获得的收益却微乎其微


这个想法仍然很有趣。实际上,我想推荐一种变体,其中可以定义一个类型为“DSL”的注释,允许使用注释声明定义的任意语言将代码放入该注释中。当然,这将是一个重大的语言变化,短期内不会发生,而且可能根本不会发生。

我会使用google collections api,它现在是guava库的一部分,它有很棒的列表和地图支持。它支持您试图实现的构造类型

public static final ImmutableList<Color> GOOGLE_COLORS
   = new ImmutableList.Builder<Color>()
       .addAll(WEBSAFE_COLORS)
       .add(new Color(0, 191, 255))
       .build();
公共静态最终不可变列表GOOGLE\u颜色
=新的ImmutableList.Builder()
.addAll(网络安全颜色)
.add(新颜色(0、191、255))
.build();

在注释中执行的代码肯定会给开发人员带来问题,但我认为这可以通过向新的贡献者提及来控制。我的示例实际上不包括任何BSF脚本,这是大多数人可能会使用它的原因。我将考虑添加它。Netbeans确实使用ant和build.xml,所以您可以修改它并用apt替换javac。Eclipse不使用ant进行构建吗?你说的是另一个IDE吗?同意,我怀疑他们是否会在语言中支持这样的特性。没有Eclipse不使用ANT进行构建。它自己进行增量构建。它有一个APT的构建器(我想),但它没有与增量构建很好地集成。至少这是我大约一年前收集的信息