今天早些时候我正在调试有点像这样的东西:
class Foo {
void AccessCriticalSection() {
try {
if (IO.File.Exists("\\path\to\lock.txt")
throw new Exception();
System.IO.File.Create("\\path\to\lock.txt");
criticalSection();
} catch (Exception ex) {
// ignored
}
}
void CriticalSection() {
// banana banana banana
System.IO.File.Delete("\\path\to\lock.txt");
}
}
Run Code Online (Sandbox Code Playgroud)
让我们甚至不知道这是多么可怕......但它本质上是试图使用一个名为lock.txt
mutex 的文件.该操作不是原子操作,如果另一个进程正在使用它,其他进程只是没有通过关键部分(如果您可以相信它们,它们的目的是能够在锁定释放后继续)等等.显然它需要修复.
如何正确获取锁以跨多个进程同步对文件系统的访问?这些进程是同一进程的多个实例,因此它们可以共享一些协议而不是专门锁定目录(即,它们可以轻松地使用等同于某些类锁定的所有实例的东西,例如private final static Object lock = new Object();
同步访问静态方法)
在.NET中,有一种简单的方法可以组合两个委托(.NET的lambda版本).
基本上,你有:
LambdaType f1 = (a, b) => doSomething(a, b);
LambdaType f2 = (a, b) => doSomethingElse(a, b);
LambdaType combined = System.Delegate.Combine(f1, f2);
// combined is equiv to: (a, b) => { f1.invoke(a, b); f2.invoke(a, b);};
Run Code Online (Sandbox Code Playgroud)
在Java中是否有这样的结合两个lambdas?什么都没想到.它是一个不错的小实用程序,虽然说实话上并不太难以定义只调用两个(或更多)的第二个lambda.
例如,您可能会执行以下操作:
public final class Library {
public void checkOut(Book book) { /* banana banana banana */ }
public void return_(Book book) { /* banana banana banana */ }
}
Run Code Online (Sandbox Code Playgroud)
但Java程序员应该遵循一个实际约定吗?
有没有办法将您的类分开放在不同的文件夹中而不将它们放在不同的包中?
我有大约 40 个类的集合,我确实希望它们都在同一个包中,但我想要一种方法来直观地对它们进行分组,这样随着规模的增长,导航会更容易一些。
有没有办法用 IntelliJ 做到这一点?在一般的Java中?
我不想要子包的原因如下:
Foo
在包中Foo
:
package Foo;
public class Foo {
public static void main(String[] args) {
Bar.FooBar(); //<--compile error
}
}
Run Code Online (Sandbox Code Playgroud)
并Bar
在包中Foo.Bar
:
package Foo.Bar;
public class Bar {
static void FooBar() {}
}
Run Code Online (Sandbox Code Playgroud) 使这种方法成为本机方法背后的逻辑是什么?
与仅使用哈希映射制作实习字符串池相比有什么优势?
看起来有点奇怪,但似乎在非本机代码中很容易做到:
import java.util.HashMap;
public class String {
// ...
private final static HashMap<String, String> pool = new HashMap<>();
public String intern() {
if (pool.containsKey(this))
return pool.get(this);
synchronized (pool) {
if (pool.containsKey(this))
return pool.get(this);
pool.put(this, this);
return this;
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
那么为什么它是本机代码呢?
我在这里错过了什么吗?如何通过运算符更改null事件引用?
class Foo
{
public event EventHandler<EventArgs> anEvent;
public Foo()
{
Console.WriteLine(anEvent == null); // true
anEvent += (sender, args) => { var i = 0; };
}
public static void Main(String[] args)
{
var a = new Foo();
Console.WriteLine(a.anEvent == null); // false
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud) 虽然有些人之前已经问过这个问题,但是在Java 8发布之前.
以前,不允许使用静态成员,因为实现细节未在接口中定义.这也是为什么没有什么应该是私有的,因为接口的实现者需要提供实现细节.
这种用Java 8改变了,不是吗?默认方法定义实现细节,静态方法也是如此.那么,为什么仍然不允许这样做?
SE,
我已经习惯了Java语法,最近不得不在工作时切换到C#.我有点困惑为什么我写的if/then/else语句之一没有按预期工作,并且想知道是否有人能够告诉我一些关于语法细节的信息为什么这不符合预期.
采取:
if (salePredicate != null)
if (!salePredicate.Invoke(s))
continue;
else
_sales.Add(s);
Run Code Online (Sandbox Code Playgroud)
在此块中,else
当salePredicate为null时,未达到该语句.然而,
if (salePredicate != null) {
if (!salePredicate.Invoke(s))
continue;
} else
_sales.Add(s);
Run Code Online (Sandbox Code Playgroud)
将达成else
声明.为什么第一个声明没有效?
(PS,我知道以下是一个选项)
if (salePredicate == null ||
salePredicate.Invoke(s))
_sales.Add(s);
Run Code Online (Sandbox Code Playgroud)
更新:声明1确实是:
if (salePredicate != null)
if (!salePredicate.Invoke(s))
continue;
else
_sales.Add(s);
Run Code Online (Sandbox Code Playgroud)
使用牙套,kiddos.
我正在运行以下查询以按字母顺序"重新排序"更新的表.有一个名为nOrder的列应该按顺序排列.我正在更新该列,如下所示:
(编辑:忘了包含AND @zone = zone
在我的问题中,但同样的问题正在发生)
UPDATE Zones
SET nOrder = 0 WHERE stateKey = @key
DECLARE @zone INT
SET @zone = 1
DECLARE @i INT
SET @i = 1
WHILE @zone < 4
BEGIN
WHILE EXISTS (SELECT TOP 1 cDisplay FROM Zones WHERE stateKey = @key AND zone = @zone AND nOrder = 0)
BEGIN
UPDATE Zones
SET nOrder = @i
WHERE cDisplay = (SELECT TOP 1 cDisplay FROM Zones WHERE stateKey = @key AND zone = @zone …
Run Code Online (Sandbox Code Playgroud) 我有以下内容:
Option Strict On
Public NotInheritable Class Root
Public Overrides Function Equals(obj As Object) As Boolean
If TypeOf obj Is Root Then
Dim rt As Root = DirectCast(obj, Root)
Return rt.container.Equals(Me.container) AndAlso
rt.question.Equals(Me.question)
End If
Return False
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
FxCop正在给我这个警告:
Warning, Certainty 95, for DoNotCastUnnecessarily
{
Target : #Equals(System.Object) (IntrospectionTargetMember)
Location : file:///C:/..../Root.vb<46> (String)
Resolution : "'obj', a parameter, is cast to type 'Root' multiple
times in method 'Root.Equals(Object)'. Cache the result
of the 'as' operator or direct …
Run Code Online (Sandbox Code Playgroud) 所以,我写了一些VB.NET代码.有点像这样:
Public Function foo() As Object
Select(someInt)
Case 1
Case 2
Case 3
return doStuff()
Case Else
Throw New ArgumentException("Can't supply that argument to this method.")
End Select
End Function
Run Code Online (Sandbox Code Playgroud)
这是很好的代码.如果有人将无效参数传递给使用此代码段的方法,它会告诉他们确切的错误位置和原因,他们可以立即修复它.但是......它"不会在每个代码路径上返回一个值." 我怎么能压制这个警告?
我想在其他方法上提供此警告,但不在此方法上.