小编Nar*_*hai的帖子

为什么Java允许增加子类中受保护方法的可见性?

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允许增加可见性,那么有两种方法可以公开显示?

我知道接口是一个解决方案但是还有其他方法吗?

java design-patterns

16
推荐指数
3
解决办法
1万
查看次数

eclipse是否使用Java Instrumentation API替换热代码

我最近有一个任务,我不得不使用热代码替换功能.所以我使用tools.jar中提供的Java Instrumentation API来完成它.

eclipse是否使用一些不同的逻辑来替换新的类文件或使用相同的Java API?我试着从一些地方读书,但不清楚:

Eclipse Java调试器通过调试通道将新类文件传输到另一个JVM

Eclipse Hot Code Replace中的这一行并不清楚.

java eclipse

15
推荐指数
1
解决办法
892
查看次数

方法参数在Java中是否安全?

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在线程之间共享
  • 如果每个Thread都有自己的副本 someObject

java multithreading thread-safety method-parameters

14
推荐指数
1
解决办法
6117
查看次数

继承和JAXB如何协同工作?

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)

java jaxb xml-serialization

13
推荐指数
1
解决办法
2万
查看次数

为什么java中的集合有int索引?

ArrayList(int initialCapacity)
Run Code Online (Sandbox Code Playgroud)

和java中的其他集合在int索引上工作.

不能有是哪里的情况下int不够的,有可能需要超过范围int

更新: Java 10或其他一些版本必须为此开发新的Collection框架.作为使用long与存在类别将打破向后兼容性.不是吗?

java collections

11
推荐指数
1
解决办法
383
查看次数

Orika - 将对象映射到列表(一对多映射)

我有两节课

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)

java orika

10
推荐指数
1
解决办法
1万
查看次数

JAXB中不区分大小写的XMLEnumValue

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枚举,我将不得不为所有枚举创建单独的适配器.

java xml enums jaxb

10
推荐指数
1
解决办法
1653
查看次数

Mockito风格的anyXXX方法用于单元测试

在对某些方法进行单元测试时,可能存在某些情况,其中某些参数的值无关紧要,可以是任何值.

例如,在这段代码中:

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)

单元测试的行为,当arg1null然后NPE必须抛出,其他参数的值并不重要,它们可以是任何值或者是null.

所以我想记录这些值对于被测方法无关紧要的事实.

我想到了以下选项:

选项1:定义常量 ANY_XXX

我想明确地创建常数的ANY_STRINGANY_INT,其中包含哪些文件,它可以是任何值,并根据测试方法不关心实际值的固定值.

我可以将所有这些常量放在一个被调用的类中Any,并在所有测试类中重用它们.

选项2:ANY_XXX的随机值

这个选项对我来说似乎有些讨厌,因为我已经在某处读过随机性不应该被带入测试用例.但在这种情况下,这种随机性将不可见,因为参数不会产生任何副作用.

哪种方法更适合更好,可读的测试?

更新:

虽然我可以通过在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)

现在在为构造函数编写测试时 …

java unit-testing hamcrest mockito

9
推荐指数
1
解决办法
1503
查看次数

Collections.max()签名的实际使用

这是签名解释的Collections.max()后续问题,其中接受的答案并未涉及此通配符的实际原因.

max方法需要一个Collection<? extends T>,我无法想到这个通配符有用的实际案例.

我甚至通过通配符提到Oracle更有趣,它说明了这一点

通常,如果您的API只使用类型参数T作为参数,则其使用应该利用较低的有界通配符(?super T).相反,如果API仅返回T,您将通过使用上限有通配符(?extends T)为您的客户提供更大的灵活性.

但我仍然没有得到它.甚至Java Generics and Collections一书也没有说明这个通配符背后的原因.

这有实际用途吗?一个真实世界的用例会很棒.

java generics wildcard

9
推荐指数
2
解决办法
409
查看次数

访问者模式使用Java 8默认方法

访问者模式(双分派)是在其自己的权利非常有用的模式,但它经常被仔细检查是否有新的成员加入到继承层次,这是一个有效点突破的接口.

但是在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将来引入新类型,则不会再破坏客户端代码.

这是否使访问者更容易接受和有用?

java oop design-patterns visitor-pattern default-method

8
推荐指数
1
解决办法
2285
查看次数