我有一个匿名的内部类和一个等效的lambda.为什么变量初始化规则对lambda更严格,是否有比匿名内部类更清晰的解决方案或在构造函数中初始化它?
import java.util.concurrent.Callable;
public class Immutable {
private final int val;
public Immutable(int val) { this.val = val; }
// Works fine
private final Callable<String> anonInnerGetValString = new Callable<String>() {
@Override
public String call() throws Exception {
return String.valueOf(val);
}
};
// Doesn't compile; "Variable 'val' might not have been initialized"
private final Callable<String> lambdaGetValString = () -> String.valueOf(val);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我确实遇到了一个解决方法:使用getter for val
.
在Java android应用程序中如何从内部匿名类访问外部类的变量?例:
ProgressDialog dialog = new ProgressDialog(this);
.....
send.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
//here i'd like to do something with **dialog** variable
.......
}
});
Run Code Online (Sandbox Code Playgroud) 如果我Class$N
在使用Eclipse时只获得了类的名称,而没有通过代码并计算每个匿名类,我如何找到一个匿名内部类?是否有"跳转到匿名类声明"功能,我可以在其中输入$后缀号码?
Search-> Java功能没有帮助.
我正在使用VisualVM来查找CPU热点.我的热点是一个名为SomeClass $ 5的匿名类.VisualVM无法找到我的类的源代码,而我(以及其他人)无法找到如何将源附加到VisualVM,如此处和此处所示 .启动器插件无法解决此问题.
计算匿名声明不是一种选择,因为从长远来看,人为错误排序数百行的风险可能导致浪费大量时间试图处理错误的匿名类,只是为了发现它是错误的类.
作为一种解决方法,我正在用'System.out.println("this="+this.getClass().getName());'
一种方法测试类, 以确保它是正确的,但必须有一个更好的方法.
这与我在这个帖子中提供的问题的答案有关:内部类是轻量级的吗?
我记得从我的阅读中可以看出,如果你只能从一个匿名的内部类创建一个对象,那么,如果你想创建一个ActionListener
类并想要从这个类中创建多个对象(不使用反射),不是使用匿名的内部类,而是使用私有的内部类或类的立场,但人们告诉我,我错了.有人可以帮我澄清一下吗?请查看链接,因为它包含更多详细信息,但如果有任何不清楚的地方,请询问!
我正在阅读"Scala for the Impatient",他们在8.8中说:
[..]你可以使用abstract关键字来表示一个无法实例化的类[..]
abstract class Person { val id: Int ; var name: String }
Run Code Online (Sandbox Code Playgroud)
几行之后:
您始终可以使用匿名类型自定义抽象字段:
val fred = new Person {
val id = 1729
var name = "Fred"
}
Run Code Online (Sandbox Code Playgroud)
因此,他们用匿名类型人工实例化Person类.在现实世界的哪种情况下,人们会想要这样做?
我正在尝试重构此代码以使用lambda而不是匿名类.它是GUI中的简单项目列表.我为每个项目注册了一个不同的监听器,并且创建的最后一个项目在单击时会执行一些特殊操作.
class ItemList {
interface OnClickListener {
void onClick();
}
OnClickListener current;
OnClickListener newListener(final int n) {
return current = new OnClickListener() {
public void onClick() {
if (this == current)
System.out.println("doing something special (item #"+n+")");
System.out.println("selected item #" + n);
}
};
}
public static void main(String[] args) {
ItemList l = new ItemList();
OnClickListener ocl1 = l.newListener(1);
OnClickListener ocl2 = l.newListener(2);
OnClickListener ocl3 = l.newListener(3);
ocl1.onClick();
ocl2.onClick();
ocl3.onClick();
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作:
$ javac ItemList.java && java ItemList
selected …
Run Code Online (Sandbox Code Playgroud) 如果仔细查看所包含的图片,您会注意到您可以使用Eclipse IDE重构Groovy代码并将方法转换为闭包,反之亦然.那么,究竟什么是闭包呢?它与方法有何不同?有人能给出一个使用闭包的好例子,以及为什么它是一个有用的功能?匿名内部课程不够好?
我有一些代码为回调处理程序定义了一个匿名内部类.这个处理程序需要分配一个局部变量,见下文.我需要resp
在回调中分配并在函数结束时引用它.我在Eclipse中遇到此错误:
resp
无法分配最终的局部变量,因为它是在封闭类型中定义的
我怎样才能解决这个问题?
DoorResult unlockDoor(final LockableDoor door) {
final UnlockDoorResponse resp;
final boolean sent = sendRequest(new UnlockDoorRequest(door),
new ResponseAction() {
public void execute(Session session)
throws TimedOutException, RetryException, RecoverException {
session.watch(UNLOCK_DOOR);
resp = (UnlockDoorResponse)session.watch(UNLOCK_DOOR);
}
});
DoorResult result;
if (!sent) {
return DoorResult.COMMS_ERROR;
}
else {
return DoorResult.valueOf(resp.getResponseCode());
}
}
Run Code Online (Sandbox Code Playgroud) 我已经厌倦了宣布整个课程能够UIAlertView
通过延长来处理点击UIAlertViewDelegate
.当我有多个可能的UIAlertView
s时,它开始感到凌乱和错误,并且必须区分在处理程序中单击的内容.
我真正想要的是创建一个实现UIAlertViewDelegate
协议的单个对象,并UIAlertView
在显示它时将这个一次性对象提供给我.
我想要这样的东西:
let confirmDelegate = UIAlertViewDelegate() {
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// Handle the click for my alertView
}
}
Run Code Online (Sandbox Code Playgroud)
然后在显示警报时使用它:
let alertView = UIAlertView(title: "Confirm", message: "Are you sure?", delegate: confirmDelegate, cancelButtonTitle: "No", otherButtonTitles: "Yes")
alertView.show()
Run Code Online (Sandbox Code Playgroud)
如果没有宣布新课程,这可能吗?
我知道我可以这样做:
class ConfirmDelegate: UIAlertViewDelegate {
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后实例化一个ConfirmDelegate()
,但我只是想知道这是否可能作为单线类声明和实例化.
anonymous-inner-class uialertview ios uialertviewdelegate swift
在onDestroy中
locationManager.removeUpdates(locationListener);
locationListener = null;
Run Code Online (Sandbox Code Playgroud)
匿名实现
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null) {
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (chatId != null) {
double radius = 6378.137;
double oldLat = mLastLocation.getLatitude();
double oldLng = mLastLocation.getLongitude();
double newLat = location.getLatitude();
double newLng = location.getLongitude();
double dLat = Math.toRadians(newLat - oldLat);
double dLng = Math.toRadians(newLng - oldLng);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(oldLat))
* Math.cos(Math.toRadians(newLat)) * Math.sin(dLng / …
Run Code Online (Sandbox Code Playgroud) java ×6
lambda ×2
android ×1
closures ×1
eclipse ×1
groovy ×1
ios ×1
java-8 ×1
leakcanary ×1
memory-leaks ×1
scala ×1
swift ×1
uialertview ×1
visualvm ×1