effective java-use function objects to represent strategies

本文介绍了如何在Java中使用策略模式,通过定义策略接口和具体策略类来实现灵活的行为选择。具体展示了如何通过匿名内部类和静态成员类来实现一次性使用或多次复用的具体策略,并提供了字符串比较策略的实例。

A primary use of function pointers is to implement the Strategy pattern.To implement this pattern in Java, declare an interface to represent the strategy, and a class that implements this interface for each concrete strategy.When a concrete strategy is used only once,it is typically declared and instantiated as an anonymous class.When a concrete strategy is designed for repeated use,it is generally implemented as a private static member class and exported in public static final field whose type is the strategy interface.


实例:

// Exporting a concrete strategy
class Host {
private static class StrLenCmp
implements Comparator<String>, Serializable {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
// Returned comparator is serializable
public static final Comparator<String>
STRING_LENGTH_COMPARATOR = new StrLenCmp();
... // Bulk of class omitted
}

Java中运用此策略模式的典型实例为:

String:

The String class uses this pattern to export a case-independent string comparator via its CASE_INSENSITIVE_ORDER field.


### 三级标题:datetime.utcnow() 被弃用的原因及替代方案 在 Python 3.12 及更新版本中,`datetime.datetime.utcnow()` 函数被标记为弃用,并计划在未来版本中移除。该函数的问题在于它返回的是一个“naive”时间对象,即不带时区信息的 UTC 时间,这可能导致时间处理逻辑中出现歧义和错误。Python 官方推荐使用“aware”时间对象,即带有明确时区信息的时间表示方式,以增强时间处理的准确性和可维护性[^1]。 弃用 `utcnow()` 的主要原因是鼓励开发者使用更清晰、更安全的时区感知时间表示方法。具体而言,`datetime.datetime.now(datetime.UTC)` 是推荐的替代方法,它返回的是一个带有 UTC 时区信息的时间对象,有助于避免因时间本地化问题导致的错误[^2]。 ### 三级标题:替代 `utcnow()` 的推荐写法 可以使用以下方式替代 `utcnow()`,以生成时区感知的 UTC 时间对象: ```python from datetime import datetime, timezone # 推荐方式:获取当前 UTC 时间并带有时区信息 now_utc = datetime.now(timezone.utc) print(now_utc) ``` 若需要获取不带时区信息的“naive”时间对象,可以使用以下方式: ```python # 获取不带时区信息的当前 UTC 时间 naive_now_utc = datetime.now(timezone.utc).replace(tzinfo=None) print(naive_now_utc) ``` 这种方式明确表达了时间的构造过程,避免了直接使用 `utcnow()` 所带来的隐含性问题[^3]。 ### 三级标题:替代 `utcfromtimestamp()` 的推荐写法 类似地,`datetime.datetime.utcfromtimestamp()` 也被弃用。推荐使用 `datetime.fromtimestamp(timestamp, tz=timezone.utc)` 来构造带有时区信息的 UTC 时间对象: ```python timestamp = 0 # 示例时间戳 utc_time = datetime.fromtimestamp(timestamp, timezone.utc) print(utc_time) ``` 若需要获取不带时区信息的 naive 时间对象,可以使用如下方式: ```python naive_utc_time = datetime.fromtimestamp(timestamp, timezone.utc).replace(tzinfo=None) print(naive_utc_time) ``` 该方法确保时间构造过程清晰可控,符合现代时间处理的最佳实践[^3]。 ### 三级标题:时区感知时间对象的重要性 Python 的 `timezone` 类是 `tzinfo` 的子类,用于表示特定的时区偏移。通过 `datetime.timezone.utc` 可以获取一个表示 UTC 的时区对象,并用于构造带有时区信息的时间实例。使用时区感知时间对象可以避免因时间本地化差异引发的逻辑错误,尤其是在跨时区系统中进行时间序列化、比较或转换时尤为重要[^4]。 例如,以下代码展示了如何构造一个带有时区信息的 UTC 时间对象: ```python from datetime import datetime, timezone utc_time = datetime(2025, 4, 5, 12, 0, 0, tzinfo=timezone.utc) print(utc_time) ``` ### 三级标题:总结 为了确保时间操作的准确性和可维护性,应避免使用已被弃用的 `utcnow()` 和 `utcfromtimestamp()` 方法。取而代之的是使用 `datetime.now(timezone.utc)` 和 `datetime.fromtimestamp(timestamp, timezone.utc)`,这些方法返回的时区感知时间对象能够更清晰地表达时间的语义,减少潜在的错误[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值