gpt4 book ai didi

java - GWT注入(inject): need good practice

转载 作者:行者123 更新时间:2023-12-01 23:53:42 26 4
gpt4 key购买 nike

我经常需要一个客户端包以及演示者和 View 中的一些国际化消息。

我想知道获得它们的最佳方式是:注入(inject)还是单例?

解决方案 1:到目前为止,我曾经使用 Singleton 来获取消息:

public interface MyMessages extends Messages{

String key1();
String key2();
...

class Instance {
private static MyMessages instance = null;

public static MyMessages getInstance() {
if (instance == null) {
instance = GWT.create(MyMessages.class);
}
return instance;
}
}
}

FooView.java:

MyMessages.Instance.getInstance().key1();

解决方案2:通过这样的注入(inject)来获得它会更好吗?

private MyMessages i18n;    

@Inject
public FooView(MyMessages i18n){
this.i18n=i18n;
}

第二个解决方案对我来说似乎更干净,但当我需要一个使用一些 i18n 字符串的非空构造函数时,我有时会陷入困境:

@Inject
private MyMessages i18n;

public Bar(Foo foo){
/*
* do something which absolutely requires i18n here.
* The problem is that injectable attributes are called
* after the constructor so i18n is null here.
*/
foobar();
}

最佳答案

首先,客户端 bundle 和 I18N 消息虽然本身不​​是单例,但会与所有实例共享其状态,因此一旦编译为 JavaScript 并由编译器优化,就好像它们是单例一样。有一些极端情况(IIRC,当使用 I18N 接口(interface)的 WithLookup 变体时),但一般来说,它不会给您带来任何明确将它们视为单例的东西。

所以问题基本上变成是显式使用 GWT.create() 还是注入(inject)实例。我想说这是一个品味问题,但从技术上来说,GWT.create() 不能很好地与非 GWTTestCase 单元测试配合使用。

最后,至于你的最新问题,我认为“非空构造函数”意味着它采用非依赖项的值(即值对象);在这种情况下,您可能应该使用辅助注入(inject),而不是自己构造对象,然后注入(inject)其成员(顺便说一句:那么您如何注入(inject)成员?)

关于java - GWT注入(inject): need good practice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com