我看到在Ruby(和动态类型语言,通常)中,一种非常常见的做法是传递散列,而不是声明具体的方法参数.例如,不是使用参数声明一个方法,而是像这样调用它:
def my_method(width, height, show_border)
my_method(400, 50, false)
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
def my_method(options)
my_method({"width" => 400, "height" => 50, "show_border" => false})
Run Code Online (Sandbox Code Playgroud)
我想知道你对它的看法.这是好事还是坏事,我们应该这样做吗?在什么情况下使用这种做法是有效的,它有什么危险的情况?
开放封闭原则指出"软件实体(类,模块,功能等)应该是可以扩展的,但是对于修改是封闭的".
然而,Joshua Bloch在其着名的书"Effective Java"中给出了以下建议:"继承的设计和文档,或者禁止它",并鼓励程序员使用"final"修饰符来禁止子类化.
我认为这两个原则显然是相互矛盾的(我错了吗?).编写代码时遵循哪个原则,为什么?你是否打开你的课程,不允许继承你的课程(哪些?),或者尽可能使用最终修饰语?
为了限制Java 7应用程序消耗的总内存,我可以使用以下公式(取自本文):
最大内存= [-Xmx] + [-XX:MaxPermSize] + number_of_threads*[-Xss]
删除PermGen后,此公式如何为Java 8应用程序更改?
我应该使用选项"-XX:MaxMetaspaceSize"来限制元空间消耗的最大内存吗?
我刚刚遇到了一个与Java序列化有关的有趣问题.
似乎我的地图定义如下:
Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
Run Code Online (Sandbox Code Playgroud)
我尝试使用ObjectOutputStream将其序列化为一个文件:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outputFile));
oos.writeObject(params);
Run Code Online (Sandbox Code Playgroud)
...我得到java.io.NotSerializableException.
但是,如果我将标准方式的值放到地图上:
Map<String, String> params = new HashMap<String, String>();
params.put("param1", "value1");
params.put("param2", "value2");
Run Code Online (Sandbox Code Playgroud)
...然后序列化工作正常.
任何人都可以告诉我它为什么会发生这些声明之间有什么区别?我认为他们应该一样,但显然我错过了一些东西.
我正在寻找使用ORM工具升级数据库模式的通用解决方案,如JPOX或Hibernate.你是如何在你的项目中做到的?
我想到的第一个解决方案是创建自己的升级数据库机制,SQL脚本完成所有工作.但在这种情况下,我必须记住每次更新对象映射时都要创建新脚本.而且我仍然需要处理低级SQL查询,而不仅仅是定义映射并允许ORM工具完成所有工作......
所以问题是如何正确地做到这一点.也许有些工具允许简化这个任务(例如,我听说Rails内置了这样的机制),如果是这样,请帮我决定为我的下一个Java项目选择哪个ORM工具.
是否有必要将所有servlet实例变量标记为"volatile"(或从同步部分中访问它们)?包括那些在"init"方法中定义的,之后没有修改过的?
我知道"init"方法是由一个线程调用的,并且该变量将被另一个线程访问,因此它似乎是必要的.或者可能不是?是否有任何机制可以保证在"init"方法完成后,所有其他线程都可以看到实例变量的当前值?
我有一个类有几个返回相同类型的方法.所以,例如,我有以下对象定义:
interface MyClass {
String first();
String second();
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个方法,它接受这个类的对象列表,并应根据参数调用其中一个first()或second()方法.一个例子:
void myMethod(List<MyClass> objs, boolean executeFirst) {
objs.forEach(obj -> System.out.println(executeFirst ? obj.first() : obj.second()));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用executeFirst参数和实例方法替换参数,我想在objs对象上执行?所以,例如,理想情况下我想要这样的东西:
void myMethod(List<MyClass> objs, Supplier<String> instanceMethod) {
objs.forEach(obj -> System.out.println(obj::instanceMethod.get());
}
Run Code Online (Sandbox Code Playgroud)