【发布时间】:2020-07-13 11:17:30
【问题描述】:
我在javax.mail 中遇到了problem handling file names,其中一些方面需要通过会话属性和一些系统属性进行配置。 javax.mail 的许多类似乎将它们处理的属性存储在静态字段中,例如以下 MimeBodyPart 的示例:
private static final boolean encodeFileName =
PropUtil.getBooleanSystemProperty("mail.mime.encodefilename", false);
据我了解,这将系统属性的具体值绑定到某个具体类加载器中的类的生命周期。谁首先加载该类,谁是唯一能够影响该值的人。这正是发生在我身上的事情:
我知道我需要设置一些特定的系统属性来影响文件名处理,并在我处理文件名的地方这样做,以使事物尽可能靠近以用于文档等目的。但由于某种原因,加载了以前的代码之前感兴趣的类,将错误的值绑定到静态字段。改变这一点的唯一方法是将我的值设置到调用层次结构中更早的位置,但我花了一些时间才注意到静态字段的事情。
这对我来说似乎是一个糟糕的策略,因为我无法轻易知道与我共享同一个类加载器的哪些代码使用了我所做的相同类。从理论上讲,这将迫使我在已经启动 JVM 时设置我的系统属性,使我的代码的实现细节成为各种不同情况下的管理细节。如果完全使用系统属性而不是 session-once,我希望这些属性会像 session-once 一样被实时查询。否则在某些情况和用例下更改相应的设置是不必要的困难。
OTOH,目前的方法可能只是有一些我不知道的好处,比如查询系统属性非常昂贵。
那么,MimeBodyPart 进行上述操作的充分理由是什么?
【问题讨论】:
-
坦率地说,javax.mail 有更多的缺陷。除了糟糕的设计,我真的想不出其他原因。
-
这是整个 Java 的标准做法。它不仅限于 JavaMail。
标签: java jakarta-mail system-properties