例如:你会做一些需要几秒钟但不想冻结你的用户界面的东西,对吗?您可以使用AsyncTask但不想创建外部(或内部)类来解决小的冻结问题.
那么,这是一个很好的实践吗?
package com.example.stackoverflowsandbox;
import android.os.AsyncTask;
public class Foo {
// E.g. before call foo method you change you Activity to loading state.
private void foo() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground( final Void ... params ) {
// something you know that will take a few seconds
return null;
}
@Override
protected void onPostExecute( final Void result ) {
// continue what you are doing...
Foo.this.continueSomething();
}
}.execute();
}
private void continueSomething() {
// some …Run Code Online (Sandbox Code Playgroud) multithreading android anonymous-class ui-thread android-asynctask
我正在用Java实现规则引擎.我的规则引擎预定义了独立规则和规则集的列表.这里的规则只是一个逻辑.规则集将这些简单规则组合成有序集.
我是一个体面的java开发人员,但不是大师.我的同事为此建议了两个设计.我对这两个设计都不满意,因此这个问题.
我的项目中的规则示例: 假设输入是美国的位置,例如,美国加利福尼亚州圣巴巴拉或美国俄亥俄州,通常采用一些定义明确的城市,州和国家/地区字段.然后我可以有如下规则:
规则1:城市不为空
规则2:状态不为空
规则3:国家等于美国或美国
规则4:州长等于2
我的项目中的RuleSet示例:
RULESET:有效位置此规则集是上面定义的规则的有序集合.
我实现的两个设计模板如下:
设计1:将Enum与匿名内部类一起使用
Rule.java
public interface Rule {
public Object apply(Object object);
}
Run Code Online (Sandbox Code Playgroud)
NlpRule.java
public enum NlpRule {
CITY_NOT_NULL(new Rule() {
@Override
public Object apply(Object object) {
String location = (String) object;
String city = location.split(",")[0];
if (city != null) {
return true;
}
return false;
}
}),
STATE_NOT_NULL(new Rule() {
@Override
public Object apply(Object object) {
String location = (String) object;
String state = location.split(",")[1]; …Run Code Online (Sandbox Code Playgroud) 在通过构造函数传递给匿名类的最终变量中,Jon Skeet提到变量通过自动生成的构造函数传递给匿名类实例.在这种情况下,为什么我无法使用反射来查看构造函数:
public static void main(String... args) throws InterruptedException {
final int x = 100;
new Thread() {
public void run() {
System.out.println(x);
for (Constructor<?> cons : this.getClass()
.getDeclaredConstructors()) {
StringBuilder str = new StringBuilder();
str.append("constructor : ").append(cons.getName())
.append("(");
for (Class<?> param : cons.getParameterTypes()) {
str.append(param.getSimpleName()).append(", ");
}
if (str.charAt(str.length() - 1) == ' ') {
str.replace(str.length() - 2, str.length(), ")");
} else
str.append(')');
System.out.println(str);
}
}
}.start();
Thread.sleep(2000);
Run Code Online (Sandbox Code Playgroud)
}
输出是:
100
constructor : A$1()
Run Code Online (Sandbox Code Playgroud) 我实例化了一个匿名类的对象,我添加了一个新方法.
Date date = new Date() {
public void someMethod() {}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能从外部调用此方法,类似于:
date.someMethod();
Run Code Online (Sandbox Code Playgroud) 我只是好奇.有没有办法访问另一个匿名类中的匿名类中的父级?
我让这个例子创建一个JTable子类(匿名类)覆盖changeSelection,在里面我创建另一个匿名类.
MCVE:
public class Test{
public static void main(String args []){
JTable table = new JTable(){
@Override
public void changeSelection(
final int row, final int column,
final boolean toggle, final boolean extend) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
super.changeSelection(row, column, toggle, extend);
//more code here
}
});
}
};
}//end main
}//end test
Run Code Online (Sandbox Code Playgroud)
我怎么能参考super.changeSelection(..)?
我以为我知道答案,但是在一小时左右的搜索后我找不到任何确认.
在这段代码中:
public class Outer {
// other code
private void method1() {
final SomeObject obj1 = new SomeObject(...);
final SomeObject obj2 = new SomeObject(...);
someManager.registerCallback(new SomeCallbackClass() {
@Override
public void onEvent() {
System.out.println(obj1.getName());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
假设registerCallback将其参数保存在某处,以便匿名子类的对象将存活一段时间.显然,这个对象必须保持一个引用,obj1以便onEvent在调用时可以工作.
但是鉴于该对象没有使用obj2,它是否仍然保持引用obj2,以便obj2在对象存在时不能进行垃圾收集?我的印象是所有可见final(或有效的最终)局部变量和参数都被捕获,因此只要对象存活就无法进行GC,但我找不到任何说明这种或那种方式的东西.
它是依赖于实现的吗?
JLS中有一节可以解答这个问题吗?我无法在那里找到答案.
我正在尝试使用反射创建匿名类的实例.但偶尔我会在瞬间看到奇怪的行为.
请查看这些类似的代码片段
public class HideAndSeek {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IllegalAccessException, InstantiationException{
final String finalString = "I'm final :)";
Object object2 = new Object(){
{
System.out.println("Instance initializing block");
System.out.println(finalString);
}
private void hiddenMethod() {
System.out.println("Use reflection to find me :)");
}
};
Object tmp = object2.getClass().newInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码运行良好,并且预期输出
Instance initializing block
I'm final :)
Instance initializing block
I'm final :)
Run Code Online (Sandbox Code Playgroud)
在此之后,我决定以简单的方式更改代码(只是添加了java.util.Calendar)
import java.util.Calendar;
public class HideAndSeek {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IllegalAccessException, InstantiationException{ …Run Code Online (Sandbox Code Playgroud) 我有一个过滤项目的界面:
public interface KeyValFilter extends Serializable {
public static final long serialVersionUID = 7069537470113689475L;
public boolean acceptKey(String iKey, Iterable<String> iValues);
public boolean acceptValue(String iKey, String value);
}
Run Code Online (Sandbox Code Playgroud)
以及包含类型成员的类KeyValFilter.
public class KeyValFilterCollector extends KeyValCollectorSkeleton {
private static final long serialVersionUID = -3364382369044221888L;
KeyValFilter filter;
public KeyValFilterCollector(KeyValFilter filter) {
this.filter=filter;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试KeyValFilterCollector使用匿名类实现时KeyValFilter:
new KeyValFilterCollector(new KeyValFilter() {
private static final long serialVersionUID = 7069537470113689475L;
public boolean acceptKey(String iKey, Iterable<String> iValues) {
for (String value : iValues) …Run Code Online (Sandbox Code Playgroud) 匿名类在c#中只读取属性.这通常用于在linq select query中声明从数据库中获取特定值.在我的代码中,我有以下查询.让我混淆使用新语句选择匿名类的新对象的事情.我有一个模型类StudentClerkshipsLogModel.当我使用模型名称时,查询结果允许编辑.
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new StudentClerkshipsLogModel
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList();
Run Code Online (Sandbox Code Playgroud)
当我new在select声明后没有提到类型时我无法退出.编译器引发错误.匿名对象是只读的.
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList()
Run Code Online (Sandbox Code Playgroud)
我的问题是linq如何以不同方式绑定两个查询.两个查询都有动态绑定,或者第一个是静态的.
谢谢
anonymous-class ×10
java ×8
final ×2
android ×1
c# ×1
calendar ×1
class ×1
constructor ×1
enums ×1
hadoop ×1
interface ×1
linq ×1
reflection ×1
ui-thread ×1