gpt4 book ai didi

java - 在 Java 中使用公共(public)字段是否可以?

转载 作者:行者123 更新时间:2023-12-03 20:20:21 26 4
gpt4 key购买 nike

<分区>

标题中的问题有点笼统,许多其他类似的问题已经得到回答,所以我理解了一般情况。主要是,在 Java 类中使用公共(public)字段会产生对类实现细节的依赖,从而导致软件的可维护性降低。

考虑到这一点,我仍然觉得我可以以某种方式使用它们。为了解释这一点,我将使用一个例子:随着 Java 8 函数式接口(interface)的到来,我终于可以使用我喜欢的事件模型,这类似于 C# 中处理事件的方式。

事件模型是在一个包中实现的,该包旨在用作我所有项目中的第三方 API。这些是主要的类:

事件参数.java

public class EventArgs implements Serializable {
}

事件处理器.java

@FunctionalInterface
public interface EventHandler<T extends EventArgs> {
void fire(Object sender, T args);
}

事件.java

public class Event<T extends EventArgs> {

private final Set<EventHandler<T>> handlers = new LinkedHashSet<>();

public void addEventHandler(EventHandler<T> handler) {
handlers.add(handler);
}

public void removeEventHandler(EventHandler<T> handler) {
handlers.remove(handler);
}

public void fire(Object sender, T args) {
for (EventHandler<T> e : handlers) {
e.fire(sender, args);
}
}
}

我通常喜欢在想要触发事件的类中做的事情是这样的:

public class SomeClass {

public final Event<SomeEventArgs> someEvent = new Event<>();

public void someMethod() {
// ...
someEvent.fire();
}
}

在想要订阅事件的类中:

public class SomeOtherClass {
private SomeClass someInstance;

public SomeOtherClass() {
someInstance = new SomeClass();
someInstance.someEvent.addEventHandler(this::someEventHandler);
}

private void someEventHandler(Object sender, SomeEventArgs args) {
// do some stuff ...
}
}

对我来说这似乎很好,因为我没有公开任何实现细节,实际上事件是类接口(interface)的一部分。我在这件事上完全错了吗?我是否仍应使用 getter 与事件交互?

我能想到的另一个例子是类中使用的记录器,但可以从外部设置以获得一定程度的详细信息。

因此,扩展这个问题,如果该字段是可以访问以实现特定行为的第三方组件,是否可以使用 public 修饰符?

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