Javadoc ReadOnlyProperty.getBean()表示:
对象getBean()
返回包含此属性的对象。如果此属性未包含在Object中,则返回null。
我注意到,在许多节点中,大多数(如果不是全部)属性都被定义getBean()为覆盖该方法。当然,考虑getBean()到Javadoc中对Java语言的描述,这样做非常有意义。
但是,大多数人(例如您和我)可能会这样做:
ObjectProperty<MyClass> myObj = new SimpleObjectProperty<>();
Run Code Online (Sandbox Code Playgroud)
我们没有覆盖该getBean()方法,没有它,一切似乎都可以工作。那么,是否有一些我们不能通过覆盖而错过的东西getBean()?
我已经看到了Javadoc给出的许多覆盖此方法的示例。例如,来自PseudoClass Javadoc:
public boolean isMagic() {
return magic.get();
}
public BooleanProperty magicProperty() {
return magic;
}
public BooleanProperty magic =
new BooleanPropertyBase(false) {
@Override protected void invalidated() {
pseudoClassStateChanged(MAGIC_PSEUDO_CLASS. get());
}
@Override public Object getBean() {
return MyControl.this;
}
@Override public String getName() {
return "magic";
}
};
private static final PseudoClass MAGIC_PSEUDO_CLASS = PseudoClass.getPseudoClass("xyzzy");
Run Code Online (Sandbox Code Playgroud)
我们大多数人甚至都不会使用抽象基类实例化属性(而且很可能甚至不熟悉)。为什么该示例将以这种方式而不是简单地这样做:
public boolean …Run Code Online (Sandbox Code Playgroud) 比方说我有一个List<List<Animal>> animals.此嵌套列表表示每个地方包含动物列表的地点列表.
我需要找出至少出现在两个不同地方的动物类型列表.我知道我可以做正常的循环并做到这一点.有什么办法可以通过Stream API完成吗?
例:
List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));
Run Code Online (Sandbox Code Playgroud)
预期(相当于):
List<Class<? extends Animal>> animalTypes = Arrays.asList(Dog.class, Bird.class);
Run Code Online (Sandbox Code Playgroud)
至于尝试,我只设法将内部列表转换为一组类:
animals.stream().map(place -> place.stream().map(animal -> animal.getClass()).collect(Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)
没有Stream API的代码:
final List<List<Animal>> animals = new ArrayList<>();
animals.add(Arrays.asList(new Dog(), new Cat()));
animals.add(Arrays.asList(new Dog(), new Bird()));
animals.add(Arrays.asList(new Bird()));
final Map<Class<? extends Animal>, Integer> count = new HashMap<>();
for (final List<Animal> place : animals) {
final Set<Class<? extends Animal>> uniqueTypes = new HashSet<>();
for …Run Code Online (Sandbox Code Playgroud) 我遇到了一种奇怪的绑定行为,这里描述了。我做了很多故障排除,我得出的结论是,最可能的问题在于我如何设置DataContext每个选项卡的视图。
我有一个TabControl其ItemsSource绑定到列表ViewModels。
MainView:
<TabControl ItemsSource="{Binding TabList}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
<v:Tab1 />
</DataTemplate>
</TabControl.Resources>
...
</TabControl>
MainViewModel:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
public MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
// Tab1ViewModel is derived from TabViewModelBase
this.TabList.Add(new Tab1ViewModel());
}
Run Code Online (Sandbox Code Playgroud)
所以,现在MainViewModel有一个列表TabViewModelBase,我相信这是正确的 MVVM 方法。视图 ( Tab1)TabViewModelBase是使用 定义的DataTemplate。
这就是问题所在:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)
我想大多数人也会这样做,但是......这种方法有一些 …
我有一个打印计数器的同步方法,我有 4 个线程,所以我期望计数器的最终值为 400000,因为我的计数器是一个静态变量。
但每次我运行代码时,它都会给我不同的计数器值。
以下是我的代码:
class MyThread implements Runnable{
private static int counter=1;
@Override
public void run() {
try {
this.syncMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void syncMethod() throws InterruptedException{
for(int i=0;i<100000;i++){
System.out.println(Thread.currentThread().getName()+" : "+counter++);
}
}
}
public class MyController {
public static void main(String[] args) throws InterruptedException {
Runnable r1=new MyThread();
Runnable r2=new MyThread();
Runnable r3=new MyThread();
Runnable r4=new MyThread();
Thread t1;
Thread t2;
Thread t3;
Thread t4;
t1=new Thread(r1,"Thread 1");
t2=new …Run Code Online (Sandbox Code Playgroud) java ×3
datacontext ×1
datatemplate ×1
java-8 ×1
java-stream ×1
javafx ×1
javafx-8 ×1
mvvm ×1
synchronized ×1
tabcontrol ×1
wpf ×1