有没有办法从Java中的匿名内部类访问调用者范围的变量?
以下是了解我需要的示例代码:
public Long getNumber(final String type, final String refNumber, final Long year) throws ServiceException {
Long result = null;
try {
Session session = PersistenceHelper.getSession();
session.doWork(new Work() {
public void execute(Connection conn) throws SQLException {
CallableStatement st = conn.prepareCall("{ CALL PACKAGE.procedure(?, ?, ?, ?) }");
st.setString(1, type);
st.setString(2, refNumber);
st.setLong(3, year);
st.registerOutParameter(4, OracleTypes.NUMBER);
st.execute();
result = st.getLong(4) ;
}
});
} catch (Exception e) {
log.error(e);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
代码位于DAO服务类中.显然它不会编译,因为它要求result是final,如果是 - 它不会编译,因为我尝试修改最终的var.我被JDK5绑定了.除了doWork()完全放弃之外,有没有办法从内部设置结果值doWork()?
这是一个很长的镜头,但我有一个有趣的编码情况,我希望能够动态创建匿名类,但能够将它们作为参数传递给期望接口或子类的方法.换句话说,我希望能够做到这样的事情:
public class MyBase { ... }
public void Foo(MyBase something)
{
...
}
...
var q = db.SomeTable.Select(t =>
new : MyBase // yeah, I know I can't do this...
{
t.Field1,
t.Field2,
});
foreach (var item in q)
Foo(item);
Run Code Online (Sandbox Code Playgroud)
除了使用命名类之外,还有什么方法可以做到这一点吗?
我今天遇到了以下问题,我想知道我的问题是否有解决方案.
我的想法是构建匿名类并将其用作WinForm BindingSource的数据源:
public void Init()
{
var option1 = new
{
Id = TemplateAction.Update,
Option = "Update the Templates",
Description = "Bla bla 1."
};
var option2 = new
{
Id = TemplateAction.Download,
Option = "Download the Templates",
Description = "Bla bla 2."
};
var list = new[] {option1, option2}.ToList();
bsOptions.DataSource = list; // my BindingSource
// cboTemplates is a ComboBox
cboTemplates.DataSource = bsOptions;
cboTemplates.ValueMember = "Id";
cboTemplates.DisplayMember = "Option";
lblInfoTemplates.DataBindings.Add("Text", bsOptions, "Description");
}
Run Code Online (Sandbox Code Playgroud)
到目前为止工作正常.
我遇到的问题是从BindingSource的"Current"属性中获取Id,因为我无法将其强制转换为匿名类型:
private void cmdOK_Click(object …Run Code Online (Sandbox Code Playgroud) 据我了解,下面的代码应该打印出来true.
但是,当我运行此代码时,它正在打印false.
匿名类总是隐式最终的
public class Test {
public static void main(String args[]) {
Object o = new Object() {
};
System.out.println("Annonymous class is final: " + Modifier.isFinal(o.getClass().getModifiers()));
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解这种行为.
我有一个类,我们称之为LineGraph,它呈现一个折线图.我需要对它进行子类化,但派生类仅在一个地方使用,并且与使用它的类耦合.所以我使用内部类.
我看到两种方法:
匿名内部阶级
public class Gui {
LineGraph graph = new LineGraph() {
// extra functionality here.
};
}
Run Code Online (Sandbox Code Playgroud)
命名内部类
public class Gui {
MyLineGraph graph = new MyLineGraph();
private class MyLineGraph extends LineGraph {
// extra functionality here.
}
}
Run Code Online (Sandbox Code Playgroud)
我不是匿名内部阶级的粉丝,因为坦率地说,我认为它看起来真的很难看.但是在一个仅在一个地方使用的子类的情况下,命名的内部类是否过度杀伤?什么是公认的做法?
我们都知道,当我们创建一个这样的匿名类时:
var Employee = new { ID = 5, Name= "Prashant" };
Run Code Online (Sandbox Code Playgroud)
...在运行时它将是类型:
<>f__AnonymousType0<int,string>
Run Code Online (Sandbox Code Playgroud)
有没有办法为这些类指定有意义的名称?
在Java中,您可以使用匿名内部类定义新的内联类.当您只需要重写该类的单个方法时,这非常有用.
假设您要创建一个子类OptionParser,只覆盖一个方法(例如exit()).在Java中,您可以编写如下内容:
new OptionParser () {
public void exit() {
// body of the method
}
};
Run Code Online (Sandbox Code Playgroud)
这段代码创建了一个匿名类,OptionParser它只扩展和覆盖该exit()方法.
Python中有类似的习惯用法吗?在这些情况下使用哪种成语?
我知道在实现Listener和类似的东西时,匿名类可以保存输入.他们试图取代一些封闭用法.
但社区对这种语言特征的价值有何看法?它是否有意义并且您经常使用它吗?它是否使代码更清晰,更易理解,更易于维护?或者匿名类使代码可读性降低?
您对此有什么看法,请举例说明/支持您的意见吗?
在Java中,当我需要一个回调函数时,我必须实现一个匿名类.在匿名类中,我可以访问外部变量final.
现在我在C++中做同样的事情.我理解C++ lambda工作得更好但有时候我需要传入许多带有匿名类的函数,我只需要传入一个实例.
我尝试了以下示例.它适用于GCC 4.3.4.
class IA {
public:
virtual int f(int x) = 0;
};
int main() {
class : public IA {
int f(int x) { return x + 1; }
} a;
doFancyWork(&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有可能像这样捕获外部变量吗?
int main() {
int y = 100; // mark y as final if possible
class : public IA {
int f(int x) { return x + y; }
} a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新:
第二个例子不会编译.错误在这里,
prog.cpp: In member …Run Code Online (Sandbox Code Playgroud) 如果我有一个动态对象或匿名对象,其结构与强类型对象的结构完全匹配,是否有.NET方法从动态对象构建类型化对象?
我知道我可以使用LINQ dynamicList.Select(dynamic => new Typed { .... }类型的东西,或者我可以使用Automapper,但我想知道是否没有专门为此构建的东西?