abstract class Base{
protected abstract void a();
}
class Child extends Base{
@Override
public void a(){
//why is this valid
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能降低能见度但可以增加它?
此外,我需要实现模板模式,其中公共方法可见只能是基类.
例:
abstract class Base{
public void callA(){
//do some important stuff
a();
}
protected abstract void a();
}
class Child extends Base{
@Override
public void a(){
//why is this valid
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果java允许增加可见性,那么有两种方法可以公开显示?
我知道接口是一个解决方案但是还有其他方法吗?
我最近有一个任务,我不得不使用热代码替换功能.所以我使用tools.jar中提供的Java Instrumentation API来完成它.
eclipse是否使用一些不同的逻辑来替换新的类文件或使用相同的Java API?我试着从一些地方读书,但不清楚:
Eclipse Java调试器通过调试通道将新类文件传输到另一个JVM
Eclipse Hot Code Replace中的这一行并不清楚.
Class Shared{
public void sharedMethod(Object o){
//does something to Object
}
}
//this is how threads call the shared method
run(){
sharedInstance.sharedMethod(someObject);
}
Run Code Online (Sandbox Code Playgroud)
现在将o作为参数传递给方法.多个线程并行调用相同的方法.我们可以安全地说这段代码是线程安全的吗?
有两种情况:
someObject在线程之间共享someObject public abstract class Parent<T> {
protected List<T> list;
@XmlTransient //Question why do we have to give this here?
public abstract List<T> getList();
public abstract void setList(List<T> list);
}
@XmlRootElement(name = "child1")
class Child1 extends Parent<ExtendedElement1>{
@Override
public void setList(List<ExtendedElement1> list){
this.list = list;
}
@Override
@XmlElementWrapper(name = "child1-list")
@XmlElement(name = "child-list-element")
public List<ExtendedElement1> getList(){
return this.list;
}
}
@XmlRootElement(name = "child2")
class Child2 extends Parent<ExtendedElement2>{
@Override
public void setList(List<ExtendedElement2> list){
this.list = list;
}
@Override
@XmlElementWrapper(name = "child1-list")
@XmlElement(name = …Run Code Online (Sandbox Code Playgroud) ArrayList(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)
和java中的其他集合在int索引上工作.
不能有是哪里的情况下int是不够的,有可能需要超过范围int?
更新:
Java 10或其他一些版本必须为此开发新的Collection框架.作为使用long与存在类别将打破的向后兼容性.不是吗?
我有两节课
class A {
class InnerA {
private String field;
// getters/setters
}
private Collection<InnerA> collection;
// getters/setters
}
class B {
private String field;
// getters/setters
}
Run Code Online (Sandbox Code Playgroud)
是否可以将A映射到B的集合(A.collection.field应该映射到B.field的集合中)?
我尝试使用自定义转换器,但我只需要管理java.lang.VerifyError:
mapperFactory.getConverterFactory().registerConverter(new CustomConverter<A, Collection<B>>() {
@Override
public Collection<B> convert(
A arg0, Type<? extends Collection<B>> arg1) {
Collection<B> result = new ArrayList<B>();
Iterator<Item> it = arg0.getCollection().iterator();
while(it.hasNext()){
it.next();
result.add(new B());
}
return result;
}
});
Run Code Online (Sandbox Code Playgroud)
结果是:
java.lang.VerifyError: Inconsistent args count operand in invokeinterface in method ma.glasnost.orika.generated.Orika_ArrayList_A_Mapper845657274.mapAtoB(Ljava/lang/Object;Ljava/lang/Object;Lma/glasnost/orika/MappingContext;)V at offset 74
at java.lang.Class.getDeclaredConstructors0(Native Method) …Run Code Online (Sandbox Code Playgroud) JAXB允许使用@XMLEnum注释直接从XML定位Enum实例.在定位值时,似乎JAXB区分大小写@XMLEnumValue.
但是我遇到了一个问题,我需要以不区分大小写的方式定位Enum实例.JAXB是否以某种方式提供此功能?没有这个,我被困在手动定位枚举常数.
我可以使用XMLAdapter它,但为每个创建的枚举维护适配器变得非常繁琐.
编辑:
为什么必须以不区分大小写的方式定位枚举?
因为我使用xml来读取系统的配置,我不希望用户被限制为固定大小写.我希望能回答你的问题.
public class CaseInsensitiveEnumAdapter<E extends Enum<E>> extends XmlAdapter<String, E> {
private final Class<E> clazz;
public CaseInsensitiveEnumAdapter(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public E unmarshal(String v) throws Exception {
return Enum.<E>valueOf(clazz, v.toUpperCase().trim());
}
@Override
public String marshal(E v) throws Exception {
return v.name();
}
}
Run Code Online (Sandbox Code Playgroud)
因为我需要.class枚举,我将不得不为所有枚举创建单独的适配器.
在对某些方法进行单元测试时,可能存在某些情况,其中某些参数的值无关紧要,可以是任何值.
例如,在这段代码中:
public void method(String arg1, String arg2, int arg3){
if(arg1 == null) throw new NullPointerException("arg1 is null");
//some other code
}
Run Code Online (Sandbox Code Playgroud)
单元测试的行为,当arg1被null然后NPE必须抛出,其他参数的值并不重要,它们可以是任何值或者是null.
所以我想记录这些值对于被测方法无关紧要的事实.
我想到了以下选项:
ANY_XXX我想明确地创建常数的ANY_STRING和ANY_INT,其中包含哪些文件,它可以是任何值,并根据测试方法不关心实际值的固定值.
我可以将所有这些常量放在一个被调用的类中Any,并在所有测试类中重用它们.
这个选项对我来说似乎有些讨厌,因为我已经在某处读过随机性不应该被带入测试用例.但在这种情况下,这种随机性将不可见,因为参数不会产生任何副作用.
哪种方法更适合更好,可读的测试?
更新:
虽然我可以通过在Any类中定义常量来使用ANY_XXX方法,但我也在考虑使用一些约束生成ANY_XXX值,例如
Any.anyInteger().nonnegative();
Any.anyInteger().negative();
Any.anyString().thatStartsWith("ab");
Run Code Online (Sandbox Code Playgroud)
我想也许Hamcrest Matchers可以用来创建这个链接.但我不确定这种方法是否合适.MockitoanyObject()已经提供了类似的方法,但这些方法仅适用于Mocks和间谍,而不适用于普通物体.我想为普通对象实现相同的功能,以获得更易读的测试.
假设我有一堂课
class MyObject{
public MyObject(int param1, Object param2){
if(param1 < 0) throw new IllegalArgumentException();
if(param2 == null) throw new NullPointerException();
}
}
Run Code Online (Sandbox Code Playgroud)
现在在为构造函数编写测试时 …
这是签名解释的Collections.max()后续问题,其中接受的答案并未涉及此通配符的实际原因.
该max方法需要一个Collection<? extends T>,我无法想到这个通配符有用的实际案例.
通常,如果您的API只使用类型参数T作为参数,则其使用应该利用较低的有界通配符(?super T).相反,如果API仅返回T,您将通过使用上限有通配符(?extends T)为您的客户提供更大的灵活性.
但我仍然没有得到它.甚至Java Generics and Collections一书也没有说明这个通配符背后的原因.
这有实际用途吗?一个真实世界的用例会很棒.
访问者模式(双分派)是在其自己的权利非常有用的模式,但它经常被仔细检查是否有新的成员加入到继承层次,这是一个有效点突破的接口.
但是在Java 8中引入默认方法之后,现在我们可以在接口中定义默认实现,客户端接口不会中断,客户端可以适当地优雅地采用更改的接口.
interface Visitor{
public void visit(Type1 type);
public void visit(Type2 type);
//added after the first version of visitor is released
default public void visit(NewType type){
//some default implementation
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用默认方法,如果NewType将来引入新类型,则不会再破坏客户端代码.
这是否使访问者更容易接受和有用?