小编Nic*_*tto的帖子

编译后在Java枚举中创建的隐式内部类

我正在学习Enum并对此代码感到困惑.

enum Currency{
    PENNY, NICKLE, DIME, QUARTER;
    @Override
    public String toString() {
            switch (this) {
                case PENNY:
                    System.out.println("Penny: ");
                    break;
                case NICKLE:
                    System.out.println("Nickle: ");
                    break;
                case DIME:
                    System.out.println("Dime: ");
                    break;
                case QUARTER:
                    System.out.println("Quarter: ");
            }
        return super.toString();
    }
};
public class Check{
    public static void main(String[] args){

    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译javac Check.java我得到以下.class文件.

Check.class
Currency$1.class
Currency.class
Run Code Online (Sandbox Code Playgroud)

为什么Currency$1.class要创建?如何?背后的原因是什么?我知道内部类的$符号和1代表匿名类1.但是为什么在这个代码中它创建了没有内部类.

java enums

6
推荐指数
0
解决办法
56
查看次数

在Generic class Java上输入参数

类型擦除是删除通用信息以便在编译类上向后兼容的过程.然后,我不知道泛型类中的对象是什么类型的类,但是在继承的类中,例如:

package generics.testing;

class Box<T> {
    private T value;

    public Box() {
        System.out.println("GenericSuperClass: " + getClass().getGenericSuperclass());
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

class IntegerBox extends Box<Integer> {}

public class GenericsTesting {
    public static void main(String[] args) {
        Box<String> box = new Box<>();
        IntegerBox ibox = new IntegerBox();
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

GenericSuperClass: class java.lang.Object
GenericSuperClass: generics.testing.Box<java.lang.Integer>
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么generics.testing.Box<java.lang.Integer>保留这些信息以及存储在哪里?

java generics

6
推荐指数
0
解决办法
68
查看次数

将环境变量传递给 Vagrant 中的供应商

我正在为我的 Vagrant 设置使用 Ansible(本地)配置器。是否有推荐的方法将环境变量传递给供应商?

例如,我想运行ENV=development vagrant up并让 Vagrant 将环境变量传递ENV给 Ansible。

我尝试使用extra_vars,取自Vagrant 文档

Vagrant.configure(2) do |vagrant|
    # other configuration
    vagrant.vm.provision :ansible_local do |ansible|
        ansible.playbook = "ansible/server.yml"
        ansible.extra_vars = {
          env: ENV.fetch("ENV", "development")
        }
    end
end
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时vagrant provision(甚至不使用envAnsible 中的变量),我得到以下信息:

$ vagrant provision
 ==> default: Running provisioner: ansible_local...
    default: Running ansible-playbook...
ERROR: Expecting property name: line 1 column 2 (char 1)
Ansible failed to complete successfully. Any error output should be …
Run Code Online (Sandbox Code Playgroud)

vagrant ansible

6
推荐指数
2
解决办法
2030
查看次数

信号量 - 为什么我的线程一个接一个地运行而不是并发运行?

我正在尝试编写一个程序,在Main类中可以启动未知数量的新线程.每个线程依次调用Singleton Copier类,该类应该调用文件传输操作.

我的目标是,无论线程请求数量多少,都要将并发传输的数量限制为2次传输,所以我想用它来解决它Semaphore.我的问题是,似乎线程一个接一个地运行而不是并发运行.

这是我试图做的:

public class Copier {

    private static final int POOL_SIZE = 2;
    private static volatile Copier instance = null;
    private static Semaphore semaphore;

    private Copier() {

    }

    public static Copier getInstance() {
        if (instance == null) {
            synchronized (Copier.class) {
                if (instance == null) {
                    instance = new Copier();
                    semaphore = new Semaphore(POOL_SIZE);
                }
            }
        }
        return instance;
    }

    public void fileTransfer(CopyThread copyThread) {
        try {
            semaphore.acquire();
            System.out.println("Running thread..."); …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading semaphore

6
推荐指数
1
解决办法
208
查看次数

模拟私有构造函数

Site课程由外部团队提供给我,有一个私人的构造函数。

public class Site
{
   int id;
   String brand;

   private Site(int id, String brand)
   {
      this.id = id;
      this.brand = brand;
   }
}
Run Code Online (Sandbox Code Playgroud)

SiteUtil类(由团队控制)是

public class SiteUtil
{
   public static Site getSite()
   {
     Site site;
     //Logic
     return site; 
   }
 }
Run Code Online (Sandbox Code Playgroud)

getSite()函数对其应用逻辑的数据需要网络调用,因此需要对其进行模拟。它目前没有设置器(也许是为了保持与数据源的一致性,不太确定)

我如下模拟

Site mockSite = new Site(1,"Google");
PowerMockito.when(SiteUtil.getSite(1)).thenReturn(mockSite);
Run Code Online (Sandbox Code Playgroud)

当我使用公共构造函数时,上面的代码当然会编译。我读的解决方案是模拟Site对象的私有构造函数。但是,我对该方法一无所知(第一次编写单元测试!)

java powermockito

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

并发LRU缓存实现

我需要线程安全且高效的LRU缓存实现代码.下面的代码不是线程安全的.是否可以使用增强此代码ConcurrentHashMap.提前致谢.

private class LruCache<A, B> extends LinkedHashMap<A, B> {
    private final int maxEntries;

    public LruCache(final int maxEntries) {
        super(maxEntries + 1, 1.0f, true);
        this.maxEntries = maxEntries;
    }

    @Override
    protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
        return super.size() > maxEntries;
    }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading

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

Collectors.toMap具有相同的键(打印相同的键)

我有这个代码来获取地图:

List<MyObject> myList = myMethod.getList();
myList.stream().collect(
    Collectors.toMap(
        MyObject::getKey, 
        MyObject::getValue,
        (e1, e2) -> {
            System.out.println("Duplicate keys !!!");
            return e1;
        }, 
        LinkedHashMap::new
    )
);
Run Code Online (Sandbox Code Playgroud)

如何用重复键打印消息"重复键"?

java java-8 collectors

6
推荐指数
2
解决办法
4502
查看次数

如何让JavaPoet生成类文字?

我想使用JavaPoet生成一个类型为literal的注释作为值.例如:

@AutoService(MyService.class)
public class GeneratedClass implements MyService {
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能想到的选项,但都没有用:

TypeSpec.classBuilder("GeneratedClass")
    .addModifiers(Modifier.PUBLIC)
    .addSuperinterface(MyService.class)
    .addAnnotation(
        AnnotationSpec.builder(AutoService.class).addMember(
            "value", "$L", MyService.class
        ).build()
    )
Run Code Online (Sandbox Code Playgroud)

使用$L生成interface MyService

使用$T生成my.package.MyService,这是接近但错过了.class部分.

使用$N给出错误:expected name but was my.package.MyService

如何将其生MyService.class成为注释值?

java javapoet

5
推荐指数
1
解决办法
261
查看次数

将Arraylist <Object>值转换为byte []

我想在下面的byte []中获取/转换Arraylist的值是我的代码

final ArrayList<Object> imglists = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)

这是我在这个arraylist m中的对象的arraylist,以字节的形式存储图像的值

for (int i=0; i<mPlaylistVideos.size();i++) {
    holder.mThumbnailImage.buildDrawingCache();
    Bitmap bitmap= holder.mThumbnailImage.getDrawingCache();
    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bs);
    byte[] rough = bs.toByteArray();
    imglists.add(i,rough);
}
Run Code Online (Sandbox Code Playgroud)

我试图从arraylist获取特定值并将其存储在byte []中这就是我想要做的事情

byte[] value=imglists.get(2);
Run Code Online (Sandbox Code Playgroud)

我找不到将Object的Arraylist转换为byte []的完整答案我知道Arraylist不支持原始数据类型(即byte)

java android arraylist

5
推荐指数
1
解决办法
2384
查看次数

模拟静态类

我在一个类中有一个方法,它实例化一个静态类实例并对其调用操作。

public class SomeClass {
    public void someMethod() {
       MyClass.MyStaticClass myStaticClassInstance =
          new MyClass.MyStaticClass( arg1, arg2, arg3 );
       myStaticClassInstance.callSomeMethod();
    }
}

public class MyClass {

   public static class MyStaticClass {

      public MyStaticClass( Object arg1, Object arg2, Object arg3 ) {
      }

      public void callSomeMethod() {
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

如何模拟静态类实例化,以便我可以在callSomeMethod()不通过静态类构造函数的情况下进行模拟?

java unit-testing mockito powermock

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