小编Ada*_*old的帖子

现场注射 - 这是一个坏习惯吗?

我和我的同事现在有几个星期有争议.我想听听社区对此的看法.

我们在申请中使用guice.在这个应用程序的UI部分,我更喜欢通过DI和自定义注释(也就是工厂的位置)来实例化所有字段和组件,并在buildUI方法中将它们连接起来.

看起来如下:

我的方法:

@Inject
@PreConfigured(caption="foo", width="100%")
Label field;

private void buildUI() {
   this.addComponent(field);
}
Run Code Online (Sandbox Code Playgroud)

我还写了一些数据绑定和i18n的注释.

我的同事这样做:

他的方法:

private Label field;

private void buildUI() {
   field = new Label();
   field.setCaption("foo");
   field.setWidth("100%");
   this.addComponent(field);
}
Run Code Online (Sandbox Code Playgroud)

这里的代码可能很长.考虑到数据绑定和其他主题,第二个代码可以变得更长,而我的方法只是另一个注释.

我的理由是:

  1. 配置所有组件的行为和外观的中心位置
  2. 代码重用
  3. 性能 - 在长时间运行的应用程序中,组件的初始化代码变得"热",jit对其进行更多优化.
  4. 更具可读性.

他的理由是:

  1. 可读性
  2. 视图代码不会遍布整个地方.
  3. 该课程没有DI
  4. 依赖注入的灵活性被高估,特别是如果注入具体类.
  5. 使用DI的唯一有效方法是构造函数注入.

但是,我还阅读了福勒的一些文章,他说,定位注射(用场注射替代)是一个糟糕的设计决定.但是在其他项目中没有重用的视图呢?

Field Injection是一个糟糕的设计吗?或者上面介绍的另一种方式更优雅?

亲切的问候基督徒

PS:我知道讨论只是基于意见而开始,但这是一个长期持续的讨论(setter vs constructor injection),这可能是值得放手的.

java dependency-injection

5
推荐指数
1
解决办法
2094
查看次数

在我的 Node.js 项目中使用相当快的操作时,如何协调 husky 预提交挂钩?

我的文件中有一个 husky 预提交钩子package.json

\n
"husky": {\n  "hooks": {\n    "pre-commit": "npx pretty-quick --staged"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的项目中还有一个.prettierrc文件:

\n
{\n  "printWidth": 100,\n  "singleQuote": false,\n  "trailingComma": "all"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是,当我更改文件(已正确格式化)并运行时,npx pretty-quick --staged我会看到我所期望的内容:

\n
  Finding changed files since git revision 88264bc2a.\n  Found 1 changed file.\n\xe2\x9c\x85  Everything is awesome!\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我尝试使用git commit钩子运行相同的命令时,我得到以下输出:

\n
husky > pre-commit (node v14.17.0)\n  Finding changed files since git revision 88264bc2a.\n  Found 1 changed file.\n\xe2\x9c\x8d\xef\xb8\x8f  Fixing up src/somefile.ts.\n\xe2\x9c\x85  Everything is awesome!\n
Run Code Online (Sandbox Code Playgroud)\n

它不应该修复该文件,因为它已经正确格式化。我检查了配置选项pretty-quick,没有选项可以确定它正在使用哪个更漂亮的配置,而且我也无法明确告诉它要使用哪个配置(尽管我只有一个 …

git node.js typescript husky prettier

5
推荐指数
0
解决办法
1157
查看次数

在LISP中使用依赖注入(以及IoC容器)的要点

我读过ESR的文章"如何成为一名黑客?" 几年前(链接可以在我的个人资料中找到),Eric建议学习LISP.好吧,我正在学习LISP很长一段时间,我非常喜欢它,所以我决定使用它来编写一个Web应用程序.

由于我使用Spring一段时间,我认为编写分离的组件并使用IoC容器和依赖注入将它们粘合在一起是个好主意.我在google上进行了一次强力搜索,结果证明在LISP中没有实现这样的想法.我错过了什么吗?在LISP中有没有很好地实现这个概念,或者出于某种原因使用它是没有意义的,这对我来说还不清楚?

spring dependency-injection common-lisp inversion-of-control

4
推荐指数
1
解决办法
927
查看次数

通过新运算符或某个接口进行对象分配

我正在浏览Java代码,我看到已经使用某个接口分配了对象,并且此接口包含一些使用newoperator 分配对象的方法.我无法想到他们为什么使用接口而不是直接使用new运算符分配对象.例如:

Animal animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

要么

Animal animal = interface.allocateAnimal()
Run Code Online (Sandbox Code Playgroud)

interface是一个界面,它有一个allocateAnimal什么都不做 的方法new Animal().

所以最终我们做的是同样的事情,但是以不同的方式,所以在这里获得了什么?

编辑1:实际上接口是在其他地方实现的.所以接口不包含任何实现代码,它只包含方法.

java

4
推荐指数
1
解决办法
301
查看次数

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space

每个身体

运行服务器时出现异常,我认为是内存泄漏!

我尝试了参数 JAVA_OPS 的许多值,但仍然出现异常!!!

在控制台中,我得到了这个异常,你可以看到如下!

Nov 18, 2013 2:48:48 PM org.apache.catalina.startup.HostConfig deployDescriptors
SEVERE: Error waiting for multi-thread deployment of context descriptors to complete
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:578)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1401)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:317)
at     
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1140)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: PermGen space …
Run Code Online (Sandbox Code Playgroud)

java tomcat memory-leaks out-of-memory

4
推荐指数
1
解决办法
2万
查看次数

有没有办法在clojure中创建一个只在函数范围内可见的命名函数?

Scheme中,我可以这样做:

(define (adder)
  (define (one) 1)
  (define (two) 2)
  (+ (one) (two)))
Run Code Online (Sandbox Code Playgroud)

调用adder的结果3,同时呼吁one,因为会产生一个错误one是只的范围内可见adder.

Clojure,如果我做类似的事情

(defn adder []
  (defn one [] 1)
  (defn two [] 2)
  (+ (one) (two)))
Run Code Online (Sandbox Code Playgroud)

onetwo会污染我的命名空间,因为defn使用def内部这在当前的命名空间创建绑定.

是否有一个函数/宏在本地范围内创建命名函数?

我的问题的原因是我习惯了Scheme的工作方式.以这种方式命名我的本地函数通常会使我的代码更具可读性.

scheme scope clojure

4
推荐指数
2
解决办法
189
查看次数

重写hashcode方法时的HashMap性能

在a中HashMap,如果我将自定义对象作为键.

如果我覆盖hashCode()方法并实现它以将值传递为' 1',会发生什么 ; 会不会有任何表现?

如果我改变hashCode()方法以使用Math.random()函数返回随机值会对性能产生什么影响?

java collections dictionary

4
推荐指数
3
解决办法
1388
查看次数

在 Java 中使用 BouncyCastle 使用 ECIES 进行加密

我正在尝试使用 Java 中的 BouncyCastle 使用 ECC 算法加密一些内容。但是我得到了 BouncyCastle 库的例外,说不能投射JCEECPublicKeyIESKey. 据我所知,生成的公钥KeyPairGeneratorJCEECPublicKey不能在javaCipher.init方法中使用的。有人可以告诉我如何将其转换为公钥或 X509 规范,以便我可以在加密中使用它。

这是我试过的代码

// add instance of provider class
Security.addProvider(new BouncyCastleProvider());

// initializing parameter specs secp256r1/prime192v1
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");

// key pair generator to generate public and private key
KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDH", new BouncyCastleProvider());

// initialize key pair generator
generator.initialize(ecSpec);

// Key pair to store public and private key
KeyPair keyPair = generator.generateKeyPair();

Cipher iesCipher = Cipher.getInstance("ECIES", new …
Run Code Online (Sandbox Code Playgroud)

java encryption cryptography bouncycastle elliptic-curve

4
推荐指数
1
解决办法
8368
查看次数

有没有办法在Undertow中使用Servlet API?

我刚刚发现了Undertow是如何工作的,我对它的api感到惊讶:

Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServerExchange exchange) throws Exception {
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send("Hello World");
                    }
                }).build();
        server.start();
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式使用更方便的servlet api

Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
                        // ...
                    }
                }).build();
        server.start();
Run Code Online (Sandbox Code Playgroud)

我想要实现的是替换当前使用的Undertow使用servlet api的Jetty容器,但是在阅读了文档和源代码后,我似乎找不到这样做的方法.我没有使用.war文件只是一个嵌入式Jetty.有人有指针吗?

java servlets undertow

4
推荐指数
1
解决办法
1891
查看次数

在Java中使用单字符泛型类型名称的原因是什么?

在Java中,JDK中的大多数(或所有?)通用类都具有个位数的通用类型名称。例如HashMap,的定义如下所示:

public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
Run Code Online (Sandbox Code Playgroud)

为什么这是约定而不是更具描述性的类型名称HashMap<KEY,VALUE>

java generics

4
推荐指数
1
解决办法
414
查看次数