在 Scala 注释中使用常量的最佳实践

发布于 2024-09-30 01:47:29 字数 552 浏览 2 评论 0原文

我使用 Tapestry 5 作为我选择的 Web 框架。 Tapestry 允许我在配置类中定义符号并将符号注入其他组件。

例如,

public interface SymbolConstants {
  static String DEFAULT_TIMEOUT_KEY = "default.timeout"; 
}

public class AppModule {
   void contributeApplicationDefault(Configuration conf) {
       conf.add(SymbolConstants.DEFAULT_TIMEOUT_KEY, "10");
   }
}

public class MyComponent {
  @Symbol(SymbolConstants.DEFAULT_VALUE_KEY)
  private long timeout;
}

定义静态常量并将其用作注释值的能力为我提供了编译时检查。

我想知道如何定义常量并将它们用作 scala 注释的值。如果没有,定义/限制我们可以分配给 scala 中注释的值的最佳实践是什么。

I use tapestry 5 as my choice of web framework. Tapestry allows me to define symbols in the configure class and inject symbols into other components.

for example,

public interface SymbolConstants {
  static String DEFAULT_TIMEOUT_KEY = "default.timeout"; 
}

public class AppModule {
   void contributeApplicationDefault(Configuration conf) {
       conf.add(SymbolConstants.DEFAULT_TIMEOUT_KEY, "10");
   }
}

public class MyComponent {
  @Symbol(SymbolConstants.DEFAULT_VALUE_KEY)
  private long timeout;
}

The ability to define static constants and use them as annotation values gives me compile time check.

I am wondering how to define constants and use them as values of scala annotations. If not, what is the best practice to define/limit the value that we can assign to annotations in scala.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦罢 2024-10-07 01:47:29

需要“final”关键字才能使编译器像在 Java 中那样发出它。例如,

object Foo
{
   final val MY_SYMBOLIC_CONSTANT="whatever"
}

否则,您似乎只能在幕后获得一个不可静态计算的访问器方法。

The 'final' keyword is required to make the compiler emit it as you would do it in Java. E.g.,

object Foo
{
   final val MY_SYMBOLIC_CONSTANT="whatever"
}

It seems that, otherwise, you only get an accessor method under the hood which is not statically calculable.

旧时光的容颜 2024-10-07 01:47:29

对于 scala 版本 2.8.1.final、2.8.2.final 或 2.9.1.final 似乎不可能(结果与所有版本相同):

object Constant { val UNCHECKED = "unchecked" }

class Test {                                       
    @SuppressWarnings(Array(Constant.UNCHECKED))   
    def test: Unit = println("testing.. 1, 2... 3")
}

<console>:7: error: annotation argument needs to be a constant; found: Constant.UNCHECKED
           @SuppressWarnings(Array(Constant.UNCHECKED))

It doesn't seem possible w/ scala versions 2.8.1.final, 2.8.2.final, or 2.9.1.final (the result was the same with all):

object Constant { val UNCHECKED = "unchecked" }

class Test {                                       
    @SuppressWarnings(Array(Constant.UNCHECKED))   
    def test: Unit = println("testing.. 1, 2... 3")
}

.

<console>:7: error: annotation argument needs to be a constant; found: Constant.UNCHECKED
           @SuppressWarnings(Array(Constant.UNCHECKED))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文