小编CKi*_*ing的帖子

与通用签名接口的静态方法

从Java 8开始,您可以在Interfaces中实现默认或静态方法,如下所示

public interface DbValuesEnumIface<ID, T extends Enum<T>> {
   T fromId(ID id);

   ID getId();
   static String getDescriptionKey(){
      return "this is a test";
   }
}
Run Code Online (Sandbox Code Playgroud)

我想声明上面的静态方法,其签名使用实现类定义的边界,因为方法的实现应该对所有人都相同,唯一不同的应该是声明的泛型,如下:

public interface DbValuesEnumIface<ID, T extends Enum<T>> {

   public static T fromId(ID id) {
        if (id == null) {
            return null;
        }
        for (T en : T.values()) {
            if (en.getId().equals(id)) {
                return en;
            }
        }
    }

    ID getId();

    String getDescriptionKey();
}
...
public enum Statuses implements DbValuesEnumIface<Integer,Statuses>
Run Code Online (Sandbox Code Playgroud)

因为T和ID不是静态的而且不能从静态上下文引用而中断.

那么,如何修改以上内容以便成功编译,如果不可能,应如何实现上述目标以实现所需目的,同时避免实现类中的代码重复.

java generics static interface java-8

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

根据row和col-python确定字母

所以我很难过,因为我非常精通Java,所以我无法想象这个看似微不足道的东西,但无论如何,我的Python教授为我们分配了一个实验室,我们必须创建一个基于行的字母模式和列位置.没有循环或迭代,只是条件语句.

例如,这个功能:

def letter(row, col):
   if row>col:
      return 'T'
   else:
      return 'W'
Run Code Online (Sandbox Code Playgroud)

会屈服:

WWWWWWWWWWWWWWWWWWWW
TWWWWWWWWWWWWWWWWWWW
TTWWWWWWWWWWWWWWWWWW
TTTWWWWWWWWWWWWWWWWW
TTTTWWWWWWWWWWWWWWWW
TTTTTWWWWWWWWWWWWWWW
TTTTTTWWWWWWWWWWWWWW
TTTTTTTWWWWWWWWWWWWW
TTTTTTTTWWWWWWWWWWWW
TTTTTTTTTWWWWWWWWWWW
TTTTTTTTTTWWWWWWWWWW
TTTTTTTTTTTWWWWWWWWW
TTTTTTTTTTTTWWWWWWWW
TTTTTTTTTTTTTWWWWWWW
TTTTTTTTTTTTTTWWWWWW
TTTTTTTTTTTTTTTWWWWW
TTTTTTTTTTTTTTTTWWWW
TTTTTTTTTTTTTTTTTWWW
TTTTTTTTTTTTTTTTTTWW
TTTTTTTTTTTTTTTTTTTW
Run Code Online (Sandbox Code Playgroud)

如果通过他的驱动文件运行,行和col都等于20.

我坚持的那个是为模式创建一个函数:

XOOOOOX
OXOOOXO
OOXOXOO
OOOXOOO
OOXOXOO
OXOOOXO
XOOOOOX
Run Code Online (Sandbox Code Playgroud)

请不要给我答案,而是指向正确的方向.

到目前为止,我知道当row == col时,可以识别左 - 右对角线的X'.这是正确的 - >左对角线我遇到了问题.

非常感谢.

python string letter

7
推荐指数
1
解决办法
575
查看次数

懒惰加载孩子,里面有热切的收藏

我有以下实体的问题:森林,树,叶.你可以想象森林可以有很多树木,树上有很多树叶.

我想懒得加载森林的所有树木,并渴望加载一棵树的所有树叶.我的hibernate注释代码如下所示:

Forest.java

@Entity
@Table(name = "Forests")
public class Forest implements Comparable<Forest> {

      @Id
      @Column(name = "forestnumber", length=10, nullable=false)
      private String number;

      @OneToMany(fetch=FetchType.LAZY, mappedBy="forest")
      private Set<Tree> trees = null;

      // some other attributes and methods
Run Code Online (Sandbox Code Playgroud)

Tree.java

 @Entity
 @Table(name = "Trees")
 public class Tree implements Comparable<Tree> {

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="tree_id", nullable=false)
        private int id;

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "forestnumber", nullable = false)
        @Fetch(FetchMode.JOIN)
        private Forest forest;

        @OneToMany(fetch=FetchType.EAGER, mappedBy="tree")
        @Fetch(FetchMode.JOIN)
        private Set<Leaf> leafs = null;

        // some other attributes and methods …
Run Code Online (Sandbox Code Playgroud)

java hibernate lazy-loading

7
推荐指数
1
解决办法
429
查看次数

聚合和依赖注入的区别

我最近研究了依赖注入设计模式。

class User
{

private $db;

public function __construct(Database $db) 
{
        $this->$db = $db;
}

}
Run Code Online (Sandbox Code Playgroud)

我不禁怀疑这我在聚合中学到的东西是一样的。如果我错了,请纠正我。我知道目标依赖注入聚集不同的。有什么我想念的吗?

php oop design-patterns dependency-injection aggregation

7
推荐指数
2
解决办法
1988
查看次数

将FlatFileItemReader与TaskExecutor结合使用(线程安全)

FlatFileItemReader与一起使用了很多示例TaskExecutor。我在下面提供了示例(都带有XML和Java Config):

我已将自己的XML配置用于大型CSV(GB大小)的开箱即用JpaItemWriter。即使不设置save-state = false或进行任何特殊处理,似乎也没有问题。

现在,FlatFileItemReader已记录为不是线程安全的

我的猜测是,JpaItemWriter通过持久保存集(即如果hashCode()equals()覆盖实体的业务密钥,则没有重复)的集合来“发现”问题。但是,即使这样,由于非线程安全的读取和处理,也无法防止重复。

您能否澄清一下:FlatFileItemReader在分配了TaskExecutor的Tasklet 中使用开箱即用的方法是否正确/正确/安全?不论作家。如果没有,我们如何在理论上解释JPAItemWriter使用a时没有错误?

PS:我上面给出的示例链接FlatFileItemReader与TaskExecutor一起使用,而没有提及所有可能的线程安全问题...

java multithreading flat-file thread-safety spring-batch

7
推荐指数
1
解决办法
1278
查看次数

是否可以使用扩展抽象类的空子类?

考虑以下:

  public abstract class Item {
     String name;
     String description;
     //concrete getters and setters follow
  }

   public class InventoryItem extends Item {
     //empty subclass of Item 
   }

  public class CartItem extends Item {
     int quantity;
     int tax;
     //getters and setters for quantity and tax follow
  }
Run Code Online (Sandbox Code Playgroud)

InventoryItem表示可供销售的项目,而CartItem表示添加到购物车的项目,因此它具有其他属性,如数量和税金.在这种情况下,是否可以使用抽象类Item的空子类?

选项2:我们可以有一个空的Item接口.InventoryItem将实现Item并定义名称和描述属性,并具有getter和setter.CartItem将从InventoryItem扩展,并将数量和税收定义为属性,并具有getter和setter.

选项3:拥有Item接口会更好吗?InventoryItem将实现Item.然后我们可以有一个CartItem类,它有'一个'项和两个属性,即税和数量

java abstract-class subclass

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

Java:在方法中将对象设置为null无效(重用代码)

我正在尝试编写一种从二进制搜索树中删除节点的方法.这是我删除节点的方法.

public void delete(int deletionNodeValue) {
    Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
    if(nodeToBeDeleted == null) return; // No node with such value exists throw an error
    if(isLeafNode(nodeToBeDeleted)) {
        nodeToBeDeleted = null;
    } else if (nodeToBeDeleted.getNumChildren() == 1) {
        bypassNode(nodeToBeDeleted);
    }else {
        replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue()));
    }
}
Run Code Online (Sandbox Code Playgroud)

我在叶子节点上检查了这个方法,但是在调试之后我发现执行的nodeToBeSelected=null发生,实际上没有删除节点.因为我仍然可以搜索已删除的值,程序仍然设法获取它.

tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
Run Code Online (Sandbox Code Playgroud)

这是我的getNode()方法

public Node<Integer> getNode(int searchValue) {
    Node<Integer> currentNode = root;
    while(currentNode != null) {
        int currentNodeValue = currentNode.getValue();
        if(searchValue == currentNodeValue)
            return currentNode;
        else …
Run Code Online (Sandbox Code Playgroud)

java algorithm reference binary-search-tree

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

为什么类型提升优先于重载方法的varargs

public class Test
{
    public static void printValue(int i, int j, int k)
    {
        System.out.println("int");
    }

    public static void printValue(byte...b)
    {
        System.out.println("long");
    }

    public static void main(String... args)
    {
        byte b = 9;
        printValue(b,b,b);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是"int".但它应该是"长"因为字节类型参数函数已经存在.但是这里的程序正在将字节值提升为int,但情况并非如此.

有人可以澄清这里发生了什么吗?

java overloading variadic-functions

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

类的两个对象是否指向相同的内存位置?

我开始学习一些Java,我已经阅读了很多关于如何通过JVM分配内存以及因此如何使用垃圾收集器释放内存的方法.

我无法找到的一件事是,如果我创建两个完全相同的新对象,它们会引用内存中的相同位置?与String Pool的工作方式类似.

java memory garbage

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

Java:如何从Thread返回中间结果

使用Java 7 我正在尝试构建一个监视数据存储(某些集合类型)的观察程序,然后在某些点返回某些项目.在这种情况下,它们是时间戳,当时间戳通过我希望它返回到起始线程的当前时间.请参阅下面的代码.

@Override
public void run() {
  while (!data.isEmpty()) {
    for (LocalTime dataTime : data) {
      if (new LocalTime().isAfter(dataTime)) {
        // return a result but continue running
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了关于未来和可赎回的内容,但他们似乎在回归时停止了这个问题.

我不特别想要返回一个值并停止线程,然后启动另一个任务,如果使用callable,除非这是最好的方法.

寻找这个的最佳技术是什么?似乎有这么广泛的做法.

谢谢

java multithreading monitor callable java-7

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