public class MiDao extends AlgunDao{
// buscar datos según nombre de columna para devolverlo en un callback
public void getDatos(List<String> columnas, ResultCallback callback){
// despues de ejecutar la solicitud, el DAO llama al callback
// con un mapa de columnas y resultados
}
public interface ResultCallback {
public void setResult(Map<String,Object> result);
}
我们想在控制器中访问这个数据库并将结果放在相应的视图中。
public class Controlador {
private MiDao dao = new MiDao();
// un método que agrega datos a vistas identificadas por un nombre que
// corresponde al nombre de la columna en la BD
private void agregarDato(String vista, Object data){
// logica que agrega los datos a las vistas
}
// un método para solicitar datos a un dao
public void llenarVistas(List<String> vistas){
// llamamos el dao con una clase anónima que implementa el interfaz
// ResultCallback
dao.getDatos(vistas, new ResultCallback(){
@Override
public void setResult(Map<String,Object> result){
// aquí podemos acceder métodos de la clase
Iterator<Entry<String,Object>> it =
result.entrySet().iterator();
while (it.hasNext()){
Entry<String,Object> e = it.next();
// llamamos un método privado del Controlador
agregarDato(e.getKey(), e.getValue());
}
}
}); // final de la clase anónima
}
}
Java 中的匿名类被大量使用,例如在侦听器、回调或事件中。匿名类的优点是它可以访问其范围内的局部变量。
一个例子。我们正在使用Dao ,它在ResultCallback中为我们提供数据库请求的结果。
我们想在控制器中访问这个数据库并将结果放在相应的视图中。
我们还可以在使用final修饰符声明的匿名类的范围内使用任何局部变量。
简而言之,使用匿名类允许您创建一个实现特定接口的对象,并且能够自由使用它,而无需显式定义一个类。
尽管从来没有绝对必要使用匿名类(使用普通类总是可以实现等效代码),但我能想到使用它们至少有 3 个优点,并且在某些情况下适用:
为了更好地理解这 3 点,让我们看一个通常使用匿名类的示例:事件侦听器。
例如,假设您正在处理一个包含多个按钮的可视化界面的项目,您需要定义每个按钮的Click事件中应该发生什么。这是通过
ActionListener
为每个按钮指定一个来实现的。使用普通类
如果没有匿名类,您必须定义一个实现接口的完整类
ActionListener
:...然后您可以在具有按钮的表单上像这样使用它:
尽管乍一看,使用单个按钮并不算太糟糕,但想象一下,
ButtonXActionListener
如果您的表单有多个按钮,必须为每个按钮定义一个类会很麻烦。此外,如果您正在查看表单代码,则单击按钮时会发生什么并不是很明显。有必要打开课程
Button1ActionListener
以便能够全面了解将要发生的事情。同样,如果您有多个按钮,为了全面了解操作,您需要打开并检查多个不同的类。最后,请注意本例中的操作是修改表单中字段的文本。但是由于该类
Button1ActionListener
无法访问表单,因此必须定义一个构造函数才能访问相关字段。这并不理想。使用匿名类
使用匿名类,您不需要在表单之外定义一个类。您可以直接在表单代码中定义按钮的操作,如下所示:
同样,假设您必须为表单上的几个按钮定义这种类型的操作。我们可以立即看到与上一个示例相比的优势:
actionPerformed()
可以直接方便地访问jText
表单的方法或类中的变量和任何其他变量。与普通类相比,这可以节省代码(正如我之前提到的,在某种程度上,嵌套类也可以帮助解决这个问题,但我不想跑题)。使用 lambda 表达式
值得一提的是,从 Java 8 开始,匿名类的许多典型用途都可以通过使用lambda 表达式来增强。基本上,在您碰巧使用具有单一方法的接口的任何地方(就像事件侦听器一样
ActionListener
),您可以使用lambda 表达式而不是匿名类。因此,尽管匿名类仍有其用途,但从 Java 8 开始,使用它们的情况越来越少。注意使用lambda 表达式的等效代码看起来是多么紧凑:
一旦您学习并习惯了 lambda 表达式语法,您就会发现它具有匿名类的所有优点,但语法更加紧凑。
匿名类的优点有很多,但这一切的根源是使用所谓的“接口”,它有助于创建尽可能抽象的类,以便以后可以重用(代码重用)。这些优点之一是通过将接口作为参数传递给匿名类,您可以自定义要执行的操作,并且在此过程中您可以轻松使用本地对象。这样您就不必创建另一个必须通过 catch 方法获取它们的类:
如果不是,则在本地覆盖接口方法,您只需调用该本地 JLabel 并使用它做任何您想做的事情。
除了所有内容之外,您还可以通过您喜欢的其他不同操作重用代码。因此,我们利用了面向对象的优势,这为我们节省了大量工作和代码中的大量混乱。让我们避免代码冗余。
有时我们创建的类几乎做同样的事情,但只改变一些动作或参数。最好创建一个支持所有内容的类。
这就像一个玉米粉蒸肉制造商,不仅知道如何制作拉贾斯玉米粉蒸肉,而且还用痣、绿色、甜味、jarochos 等制作它们。而且这样的类要强大得多。因为它支持一切。
我不知道我是否让自己明白了。问候。
实际上,这是一种常见且当前的方法。
但...
该方法实际上是一个接口,将作为参数发送,以便另一个方法处理它并使用该代码的内容。
显然,当被发送到另一个方法时,该函数不仅将是您放入匿名类的内容,而且还将与一个额外的函数一起使用:
例如,在不同的线程中执行该方法。
仅靠简单的方法是无法做到的。在这种情况下,线程对象需要它作为其 run() 方法的参数,以便通过算法,可以在不同的线程中执行可以是 hello world 或其他任何自定义操作。